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
import           Data.Array
import           Data.List

main :: IO ()
main = loop 1
  where
    loop c  = do
      w <- readLn
      if w == 0
         then return ()
         else do
           n <- readLn
           xs <- replicateM n getLine
           let xs'      = map (tup . words . map c2s) xs
               (vm, wm) = solve w xs'
           putStrLn $ "Case " ++ show c ++ ":"
           print vm
           print wm
           loop (c + 1)

    c2s ',' = ' '
    c2s c   = c

    tup (x:y:_) = (read x, read y)


solve :: Int -> [(Int, Int)] -> (Int, Int)
solve wmax ts = dp ! (nt, wmax)
  where
    dp = array ((0, 0), (nt, wmax)) [((i, j), f i j) | i <- [0..nt], j <- [0..wmax]]
    -- i ???????????§??§????????? j ??\?????¨????????¨??????????????¨??????
    f 0 w = let ti@(vi, wi) = ts !! 0
            in  if wi <= w then ti else (0, 0)
    f i w = let ti@(vi, wi) = ts !! i
                tp          = dp ! (i - 1, w)
                tps         = [dp ! (i - 1, j) | j <- [0..(w - wi)]]
            in  maximum' $ [ti, tp] ++ [(vpsi + vi, wpsi + wi) | (vpsi, wpsi) <- tps, (wpsi + wi) <= wmax]

    max' t1@(v1, w1) t2@(v2, w2)
      | v1 == v2  = (v1, min w1 w2)
      | otherwise = max t1 t2

    maximum' = foldl max' (0, 0)

    nt = length ts - 1