Problem:
泥棒

宝物がたくさん収蔵されている博物館に、泥棒が大きな風呂敷を一つだけ持って忍び込みました。盗み出したいものはたくさんありますが、風呂敷が耐えられる重さが限られており、これを超えると風呂敷が破れてしまいます。そこで泥棒は、用意した風呂敷を破らず且つ最も価値が高くなるようなお宝の組み合わせを考えなくてはなりません。

風呂敷が耐えられる重さ W、および博物館にある個々のお宝の価値と重さを読み込んで、重さの総和が W を超えない範囲で価値の総和が最大になるときの、お宝の価値総和と重さの総和を出力するプログラムを作成してください。ただし、価値の総和が最大になる組み合わせが複数あるときは、重さの総和が小さいものを出力することとします。

Input

複数のデータセットが与えられます。各データセットは以下のような形式で与えられます。

W
N
v1,w1
v2,w2
:
vN,wN

１行目に風呂敷の耐えられる重さを表す整数 W (W ≤ 1,000)、２行目にお宝の数 N (1 ≤ N ≤ 1,000) が与えられます。続く N 行に i 番目のお宝の価値を表す整数 vi (0 ≤ vi ≤ 10,000) とその重さを表す整数 wi (0 ≤ wi ≤ W) の組がそれぞれ１行に与えられます。

W が 0 のとき入力の最後とします。データセットの数は 50 を超えません。

Output

各データセットに対して以下のように出力して下さい。

Case データセットの番号:
風呂敷に入れたお宝の価値総和
そのときのお宝の重さの総和

Sample Input

50
5
60,10
100,20
120,30
210,45
10,4
50
5
60,10
100,20
120,30
210,45
10,4
0

Output for the Sample Input

Case 1:
220
49
Case 2:
220
49

Solution in Haskell (judge verdict: Memory Limit Exceeded)

import Control.Monad

main :: IO ()
main = do
  loop 1
loop :: Int -> IO ()
loop c = do
  w <- readLn
  if w == 0
  then return ()
  else do
    n <- readLn
    ls <- replicateM n getLine
    let ls' = map (map read . words') ls
        initArray = zip (repeat 0) [0..w]
        ans = solve initArray ls'
    putStrLn $ "Case " ++ (show c) ++ ":"
    print $ fst ans
    print $ snd ans
    loop (c+1)

words' :: String -> [String]
words' s = words'' s [[]]
words'' :: String -> [String] -> [String]
words'' [] new = new
words'' (',':xs) new = words'' xs (new ++ [[]])
words'' (x:xs) new = words'' xs ((init new) ++ [(last new) ++ [x]])

solve :: [(Int,Int)] -> [[Int]] -> (Int,Int)
solve array [] = getMax array
  where
    getMax :: [(Int,Int)] -> (Int,Int)
    getMax array = getMax' (reverse array)
      where
        getMax' :: [(Int,Int)] -> (Int,Int)
        getMax' [(v,w)] = (v,w)
        getMax' ((v1,w1):(v2,w2):r)
          | v1 > v2 = (v1,w1)
          | otherwise = getMax' ((v2,w2):r)
solve array (x:xs) = solve (update array x array) xs
  where
    update :: [(Int,Int)] -> [Int] -> [(Int,Int)] -> [(Int,Int)]
    update [] _ _ = []
    update ((a,b):r) [v,w] array = (a',b):(update r [v,w] array)
      where
        a' = if w > b
          then a
          else max a ((getV (b-w) array) + v)
               where
                 getV :: Int -> [(Int,Int)] -> Int
                 getV w' ((v,w):r)
                   | w' == w = v
                   | otherwise = getV w' r