あなたは、異なる宗派やお金の総量のコイン与えられている 量を。あなたはその金額を構成するために必要なコインの最小数を計算する関数を書きます。お金の量は、コインの任意の組み合わせによって構成されたことができない場合は、返します -1
。
実施例1:
コイン= [1, 2, 5]
、量= 11
リターン 3
(11 = 5 + 5 + 1)
実施例2:
コイン= [2]
、量= 3
リターン -1
。
注意:
あなたは、コインの種類ごとの無限の数を持っていることを仮定してもよいです。
バックパックVIと組み合わせサムIVは:目標値にすべての可能な組み合わせの合計を探します
コインの変更:目標値に加算し、要素の最小数を使用して組み合わせを探します
状態:DP [I]:コインの最小数は、私にその合計を必要と
関数:DP [I] = Math.min(DP [I]、DP [I - コイン[J]] + 1)において、i> =コイン[J] && DPなら[I - コイン[J] <整数。 MAX_VALUE
I> =コイン[J]:のみ、その値が目標値Iよりも大きくない場合、コインを選ぶ考えます。
DP [I - コイン[J]] <Integer.MAX_VALUEを:私たちはピックコイン[j]を行った場合、我々は合計の組み合わせを見つけることができなければなりません
iは - コイン[J]。
初期化:DP [0] = 0、DP [I] = Integer.MAX_VALUEで、iについて> = 1
回答:DP [量]または-1
1つの パブリック クラスソリューション{ 2 公共 INT coinChange(INT []コイン、int型の量){ 3 であれば(量<= 0 ){ 4 戻り 0 ; 5 } 6 場合(コイン== NULL || coins.length == 0 ){ 7 リターン -1 。 8 } 9 INT [] DP = 新しい INT [量+ 1 ]。 10 DP [0] = 0 。 11 のために(int型 I = 1; 私は<=量を、I ++ ){ 12 DP [I] = Integer.MAX_VALUEの; 13 } 14 のために(int型 i = 1; iが<=量; Iは++ ){ 15 のために(INT J = 0; J <coins.length; J ++ ){ 16の 場合(iは> =コイン[J] && DP [iが-コイン[J] < Integer.MAX_VALUEの){ 17 、DP [I] = Math.min(DP [I]、DP [I -コイン[J]] + 1 )。 18 } 19 } 20 } 21 であれば(DP [量] < Integer.MAX_VALUEの){ 22 リターンDP [量]。 23 } 24 リターン -1 。 25 } 26 }
関連問題
バックパックVI
コンビネーション合計IV