代码背后的主要思想是: “在每个步骤中有ways
方法来改变i
金额给予硬币[1,...coin]
“。
因此,在第一次迭代中,您只有面额为1
的硬币。我相信显而易见的是,只有一种方法可以让任何目标只有这些硬币。在此步骤ways
阵列将看起来像[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]
。
上面给出的代码完全等价于递归解决方案。如果您了解the recursive solution,我敢打赌你明白上面给出的解决方案。