toysolver-0.2.0: samples/programs/knapsack/knapsack.hs
{-# LANGUAGE ScopedTypeVariables #-}
{-# OPTIONS_GHC -Wall #-}
module Main where
import Control.Monad
import Data.List
import System.Environment
import System.IO
import Text.Printf
import qualified ToySolver.Combinatorial.Knapsack.BB as Knapsack
type Value = Integer
type Weight = Integer
main :: IO ()
main = do
args <- getArgs
case args of
[fname] -> do
(items, capa) <- load fname
let (val,_w,sol) = Knapsack.solve [(fromInteger val, fromInteger weight) | (val, weight) <- items] (fromInteger capa)
printf "%d %d\n" (round val :: Integer) (1::Int)
putStrLn $ intersperse ' ' [if b then '1' else '0' | b <- sol]
load :: FilePath -> IO ([(Value, Weight)], Weight)
load fname =
withFile fname ReadMode $ \h -> do
[nitems, capa] <- liftM (map read . words) $ hGetLine h
items <- replicateM (fromInteger nitems) $ do
[value,weight] <- liftM (map read . words) $ hGetLine h
return (value, weight)
return (items, capa)