コードの背後にある主なアイデアは次のとおりです。「各ステップには、与えられたコインの金額をways変更する方法があります」.i[1,...coin]
したがって、最初の反復では、 の額面のコインしかありません1。どのターゲットに対しても、これらのコインのみを使用して変更を加える方法が 1 つしかないことは明らかだと思います。このステップでは、ways配列は( からまで[1,...1]のすべてのターゲットに対して一方向のみ) のようになります。0target
2次のステップでは、前のコインのセットに の額面のコインを追加します。0これで、 からまでの各ターゲットに対していくつの変更の組み合わせがあるかを計算できますtarget。明らかに、組み合わせの数は、ターゲット >= 2(または一般的なケースで追加された新しいコイン) の場合にのみ増加します。したがって、ターゲットが等しい場合2、組み合わせの数はways[2](old)+になりますways[0](new)。i一般に、新しいコインが導入されるたびに、1以前の組み合わせの数に追加する必要があり、新しい組み合わせは 1 つのコインのみから構成されます。
target>の場合2、答えは「すべてのコインがそれより小さい金額のすべての組み合わせ」と「すべてのコインがそれ自体より小さい金額のすべての組み合わせ」の合計で構成targetさcoinれcoinますcoin。
ここでは 2 つの基本的な手順について説明しましたが、一般化するのは簡単だと思います。
target = 4と の計算ツリーを示しますcoins=[1,2]。
方法[4] 与えられたコイン=[1,2] =
方法[4] 与えられたコイン=[1] + 方法[2] 与えられたコイン=[1,2] =
1 + 方法[2] 与えられたコイン=[1] + 方法[0] 与えられたコイン=[1,2] =
1 + 1 + 1 = 3
したがって、変更を加えるには 3 つの方法があります[1,1,1,1], [1,1,2], [2,2]。
上記のコードは、再帰的なソリューションと完全に同等です。再帰的な解決策を理解していれば、上記の解決策を理解しているに違いありません。