代码背后的主要思想如下:“在每一步都有ways
办法改变i
给定硬币的金额[1,...coin]
”。
因此,在第一次迭代中,您只有一枚面额为 的硬币1
。我相信很明显,只有一种方法可以让任何目标都只使用这些硬币。在这一步上,ways
数组看起来像(从to[1,...1]
的所有目标只有一种方式)。0
target
在下一步中,我们将面额为 的硬币添加2
到前一组硬币中。0
现在我们可以计算每个目标从到有多少变化组合target
。显然,组合的数量只会增加目标>= 2
(或添加新硬币,一般情况下)。所以对于一个目标等于2
组合的数量将是ways[2](old)
+ ways[0](new)
。通常,每次i
引入新硬币时,我们都需要添加1
先前的组合数量,其中新组合仅由一枚硬币组成。
对于target
> 2
,答案将包括“所有硬币都小于的数量的所有组合”和“所有硬币都小于自身的数量的所有组合target
”coin
的coin
总和coin
。
这里我描述了两个基本步骤,但我希望它很容易概括。
让我向您展示一个计算树target = 4
和coins=[1,2]
:
给定硬币的方式[4] = [1,2] =
方式[4] 给定硬币=[1] + 方式[2] 给定硬币=[1,2] =
1 + 方式[2] 给定硬币=[1] + 方式[0] 给定硬币=[1,2] =
1 + 1 + 1 = 3
因此,有三种方法可以进行更改:[1,1,1,1], [1,1,2], [2,2]
。
上面给出的代码完全等同于递归解决方案。如果您了解递归解决方案,我敢打赌您了解上面给出的解决方案。