wvogel日記

自分用の技術備忘録が多めです.

部分和

与えられた値 a と数字列に対し、
数字列の部分和が a に等しくなることがあるかどうかを判定するという問題。
昔解いたときはタプルとか使ってややこしく解いた気がするけど、割合スマートに解けた気がするので

main = do an <- getLine
          cs <- getContents
          print.sumf (a an) 0 .datalist (n an) $ cs
  where
    n = read.head.tail.words
    a = read.head.words

datalist :: Int -> String -> [Int]
datalist n = map read.take n.words

sumf :: Int -> Int -> [Int] -> Bool
sumf a k [] = a == k
sumf a k (x:xs) = sumf a k xs || sumf a (k+x) xs