Skip to content

Instantly share code, notes, and snippets.

@khafatech
Last active February 20, 2019 21:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save khafatech/5eb8a74011999b602f4bcd494b2a7323 to your computer and use it in GitHub Desktop.
Save khafatech/5eb8a74011999b602f4bcd494b2a7323 to your computer and use it in GitHub Desktop.
module Main where
superset xs = []:(superset' xs) -- remember the empty list
superset' (x:xs) = [x]:(map (x:) (superset' xs)) ++ superset' xs
superset' [] = []
items = [("Ant Repellent", 1, 2),
("Beer", 3, 9),
("Blanket", 4, 3),
("Bratwurst", 3, 8),
("Brownies", 3, 10),
("Frisbee", 1, 6),
("Salad", 5, 4),
("Watermelon", 10, 10)]
data Bag = Bag [([Char], Integer, Integer)] deriving Show
value = sum . map (\(_, _, x) -> x)
volume = sum . map (\(_, x, _) -> x)
bag_volume (Bag items) = volume items
bag_value (Bag items) = value items
instance Eq Bag where
(Bag items1) == (Bag items2) = (value items1) == (value items2)
instance Ord Bag where
(Bag items1) `compare` (Bag items2) = (value items1) `compare` (value items2)
knapsack max_volume items =
maximum $ map Bag ok_volume where
ok_volume = filter (\x -> volume x <= max_volume) $ superset items
main = do
let best = knapsack 11 items
print $ best
putStrLn $ "max volume: " ++ (show $ bag_volume best)
putStrLn $ "max value: " ++ (show $ bag_value best)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment