Jump to content

Knapsack problem/Continuous: Difference between revisions

Added Haskell.
(added ocaml)
(Added Haskell.)
Line 34:
 
'''Which items does the robber carry in his knapsack so that their total weight does not exceed 15 kg, and their total value is maximised?'''
 
=={{header|Haskell}}==
 
We use a greedy algorithm.
 
<lang haskell>import Control.Monad
import Data.List (sortBy)
import Data.Ord (comparing)
import Text.Printf
 
maxWgt = 15
 
data Bounty = Bounty
{itemName :: String,
itemVal, itemWgt :: Rational}
 
items =
[Bounty "beef" 36 3.8,
Bounty "pork" 43 5.4,
Bounty "ham" 90 3.6,
Bounty "greaves" 45 2.4,
Bounty "flitch" 30 4.0,
Bounty "brawn" 56 2.5,
Bounty "welt" 67 3.7,
Bounty "salami" 95 3.0,
Bounty "sausage" 98 5.9]
 
solution :: [(Rational, Bounty)]
solution = g maxWgt $ sortBy (flip $ comparing f) items
where g room (b@(Bounty _ _ w) : bs) = if w < room
then (w, b) : g (room - w) bs
else [(room, b)]
f (Bounty _ v w) = v / w
 
main = do
forM_ solution $ \(w, b) ->
putStrLn $ showRat w ++ " kg of " ++ itemName b
putStrLn $ "Total value: " ++ showRat (sum $ map f solution)
where f (w, Bounty _ v wtot) = v * (w / wtot)
showRat q = printf "%.2f" x
where x = fromInteger (round $ q * 100) / 100 :: Double</lang>
 
=={{header|Java}}==
Line 264 ⟶ 305:
2,4 kg greaves (value = 45)
3,5 kg welt (value = 63,378)</pre>
 
 
 
=={{header|OCaml}}==
845

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.