代碼背後的主要思想是: 「在每個步驟中有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,我敢打賭你明白上面給出的解決方案。