あなたは、異なる宗派やお金の総量のコイン与えられている 量を。あなたはその金額を補うために必要があるとコインの最小数を計算する関数を書きます。お金の量は、コインの任意の組み合わせによって構成されたことができない場合は、返します -1
。
例1:
入力:コイン=[1, 2, 5]
、量=11
出力:3
説明:11 = 5 + 5 + 1
例2:
入力:コイン=[2]
、量=3
出力:-1
注:
あなたは、コインの種類ごとの無限の数を持っていることを仮定してもよいです。
、ターゲットの合計が生成できない場合は、それを確実にするために必要なコインの最小番号を選択する方法を見つける異なる宗派のコインの級数の和、およびターゲット、-1:タイトルはそれを理解しました。
あなたが最小数量の量を知りたい場合は、この問題は非常に一般的なDPの問題は、実際には、(現在のコイン金種+までの残りの最小数を選択し、現在の硬貨の種類の最小数ではない投票)最大を見ることです
各硬貨の金種は0よりINT(整数)以上であるため、いくつかの小さなヒントがあることに注意してください - 状態方程式は[I] = MAX(+ 1 F [I]、F [last_coin i])とFに変換されます。 (または意味無し)、それが最大の成分であり得ます
量が量(すべては$ 1です)でなければならない、そして量+ 1の最大値は、この値が上限を設定することができますタッチすることはありません。最終的にのみ比較F [量]>量が解けるかどうかを判断することができる必要があります。
次にする事は可能性のすべてを一覧表示することです:
1.異なる金種に対応した電流量
電流量に対応する2.異なる宗派
必要性のリストは、現在選択されている現在のamount-> 0のコインの額面、Iようコイン[I]からjが開始することを保証Jようにするための第2のケースでは、ときに、第2のサイクル - コイン[I]> = 0
同様に詳細:それは1索引付け(インデックス、すなわちかなりの量よりも、選択された量に対応する - 1)であるため、長さfは、+ 1時間量に設定されるように設定されています。
解決策1:
1 の#define VIベクトル<整数> 2 クラスソリューション{ 3 公共: 4 INT coinChange(VI&コイン、int型の量){ 5 VI F(量、量+ 1 )。 6 INT N = coins.size()。 7 F [ 0 ] = 0 ; 8 用(INT iが= 0 ; iが<N; ++ I) 9 ため(INT J =コイン[I]; J <=量; ++ j)は 10 F [J] =分(F [J]、F [J -コイン[I] + 1 )。 11 リターン [量]>量F?- 1 :F [量]。 12 } 13 }。
あなたは、異なる宗派や合計金額のコインを与えられています。その金額を構成する組み合わせの数を計算する関数を記述します。あなたは、コインの種類ごとの無限の数を持っていることを仮定してもよいです。
例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ビット整数に収まるように保証されています
トピックは理解して:違いはここで、最初の質問ではなく最小のソリューションよりも、すべてのプログラムの数を計算する必要があるということです。現在のプログラム量=私のすべてのコンポーネントにF [i]を変更しての状態を考えるのが自然であるようにします。
次に、状態方程式は、次のとおり電流量のすべてのプログラム要素がプログラムの現在のコイン金種数+ =番号の前に選択されていません
ここでの開始値は、量は0であり、そして唯一の番号方式は(方式が取られていない)がある場合を示し、1であります
解決策1:
1 の#define VIベクトル<整数> 2 クラスソリューション{ 3 公共: 4 int型の変化(INTの量、VI&コイン){ 5 VI F(量+ 1、0 ); 6 F [ 0 ] = 1 ; 7 INT N = coins.size()。 8 用(INT iが= 0 ; iが<N; ++ I) 9 ため(INT J =コイン[I]; J <=量; ++ j)は 10 F [J] + = F [J - コイン[I]]。 11 リターンF [量]。 12 } 13 }。