我找到了一个解决 找零问题 的动态规划方案,具体内容如下:
count' :: Int -> [Int] -> Int
count' cents coins = aux coins !! cents
where aux = foldr addCoin (1:repeat 0)
where addCoin c oldlist = newlist
where newlist = (take c oldlist) ++ zipWith (+) newlist (drop c oldlist)
它比我天真的自顶向下递归解决方案运行得快得多,我仍在努力理解它。
我明白给定一组硬币,aux
计算正整数的每个解决方案。因此,一个金额的解决方案是在该位置处索引列表。
但是,我对addCoin
不太清楚。它如何使用每个硬币的价值从硬币列表中提取元素?我很难找到它的直观含义。
aux
中的折叠也使我的大脑混乱。为什么1:repeat 0
是初始值?它代表什么?