ここでのオリジナルタイトルリンク:https://leetcode.com/problems/coin-change-2/
トピック:
あなたは、異なる宗派や合計金額のコインを与えられています。その金額を構成する組み合わせの数を計算する関数を記述します。あなたは、コインの種類ごとの無限の数を持っていることを仮定してもよいです。
例1:
入力:量= 5、コイン= [1、2、5] 出力:4 説明:量を補うために、4つの方法があります。 5 = 5 5 = 2 + 2 + 1 5 = 2 + 1 + 1 + 1 5 = 1 + 1 + 1 + 1 + 1
例2:
入力:量= 3、コイン= [2] 出力:0 説明:3の量がちょうど2のコインで作らことができません。
例3:
入力:量= 10、コイン= [10] 出力:1
注意:
あなたはそれを取ることができます
- 0 <=量<= 5000
- 1 <=コイン<= 5000
- コインの数が500未満であります
- その答えは、符号付き32ビット整数に収まるように保証されています
ソリューション:
そこにどのように多くの方法、Jを補うために、1つの鉄 - [j]が最初のiと表す[I] DPましょう。
DP [I] [J] = DP [I-1]〜[J] + DP [I] [J - コイン[I - 1]。
DP [I - 1] [j]は、コインを使用せずに、[I - 1]、Jを構成するための方法。
私たちはコインを使用しているのでコイン[I - - 1] [I - 1]、我々は量jからの方法をaccumlateする必要があります。
時間計算:O(金額* n個)。N = coins.length。
スペース:O(量)。
ACのJava:
1 クラスソリューション{ 2 公共 int型の変化(INT量、INT []硬貨){ 3 であれば(量<0 ||コイン== NULL ){ 4 戻り 0 ; 5 } 6 7 INT [] DP = 新しい INT [量+ 1 ]。 8 DP [0] = 1 ; 9 10 のための(int型コイン:コイン){ 11 のために(INT I 1 =; I <=量; iが++ ){ 12 もし(I -コイン<0 ){ 13 続けます。 14 } 15 16 DP [I] + = DP [I - コイン]。 17 } 18 } 19 20 戻りDP [量]。 21 } 22 }
同様のコインを変更。