fork(1) download
  1. import Data.List
  2. import Control.Monad
  3.  
  4. numOfSplits :: Integer -> Integer
  5. numOfSplits a
  6. | (abs a) > 500 = -1
  7. | (abs a) == 0 = 0
  8. | otherwise = intzahler $ makeChange [200,100,50,20,10,5,2,1] (abs a) 200
  9.  
  10. intzahler :: [[Integer]] -> Integer
  11. intzahler array
  12. | array == [] = 0
  13. | otherwise = 1 + intzahler (tail array)
  14.  
  15. makeChange :: [Integer] -> Integer -> Integer -> [[Integer]]
  16. makeChange coins amount maxCoins
  17. | amount < 0 = []
  18. | amount == 0 = [[]]
  19. | null coins = []
  20. | amount `div` maximum coins > maxCoins = [] -- optimisation
  21. | amount > 0 =
  22. do x <- coins
  23. xs <- makeChange (filter (<= x) coins) (amount - x) (maxCoins - 1)
  24. guard $ genericLength (x:xs) <= maxCoins
  25. return (x:xs)
  26.  
  27. main = do
  28. let n = 180
  29. putStrLn $ "numOfSplits " ++ show n ++ " = " ++ show (numOfSplits n)
  30.  
Success #stdin #stdout 4.68s 8336KB
stdin
Standard input is empty
stdout
numOfSplits 180 = 46777