コインコインの異なる宗派や金額の合計額を考えます。私たちは、合計金額を構成するために必要なコインの最小数を計算するための関数を書くことができます。コインの合計金額のいずれかで構成することができない組み合わせがない場合、-1を返します。
例1:
入力:コイン= [1、2、 5]、量= 11
出力:3
解説:11 = 5 + 5 + 1
例2:
入力:コイン= [2]、量 = 3
出力:-1
出典:滞在ボタン(LeetCode)
リンク:https://leetcode-cn.com/problems/coin-change
問題解決のアイデア:
このタイトルは、動的プログラミングアルゴリズムクラスです。
動的なプログラミングのアイデアを問題解決:
決定状態:
1、アクティブ状態の動的なプログラミングでは、スタンド属します。
2、動的なプログラミングソリューションは、あなたは、配列を開くために必要がある場合。そのような配列F [I]またはF [I] [J]の平均ものとして。
最後のステップ- -子供の問題:3は、意識の二つの状態の必要性を判断します。
この問題のために、例えば、27量、コイン[2,5,7-]。
我々は最適な政策が、最善の戦略は確かにKコインのA1、A2であるかわからないが、... AK 27まで追加。だから、そのコインAKを取り除く、AK-1、残りのコインが27-AKまで追加、最後のコインAKがなければなりません。それが最善の策であるので、コインの最小数を綴るために27-AKがあるか、それが最適な戦略ではありませんので。だからサブ質問がある:少なくとも27-AKでどのように多くのコインを綴ります。元の質問です:どのように多くの金貨27呪文の最小値を持ちます。(私たちは、サブ問題と呼ばれる小さなスケールとして発行されます)私たちはセットFの状態を(X)= Xを使用コインの最小数を綴ります。
最後のコインは、2,5,7-のいずれかである可能性があります。最後に、コインが2である場合、F [X] = F(27-2 )+1; 最後の硬貨5、F [X] = F(27-5である場合 )+1; 最後の1つが図7は、コイン、F [X] = F(27-7である )+1。
第二に、伝達方程式:
したがって、最終的な伝達方程式:F [X] = {F Math.min(27-2)+ 1、F(27-5)+ 1、F(27-7)} + +1。
第三に、初期条件と境界条件は:
F(27-2)、F(27-5場合 )、F(27-7)が行う方法ゼロより小さいのですか?私たちは、正の無限大と定義しました。F初期条件[0] = 0;
第四に、計算順序:
我々は昇順であり、この問題のために、我々は最初のF [0]を算出、F [1 ] ... F [27]
コード:
class Solution {
public int coinChange(int[] coins, int amount) {
int[] f = new int[amount+1];
int n = coins.length;
f[0] = 0;
int i,j;
for(i=1;i<=amount;i++){
f[i] = Integer.MAX_VALUE;
for(j=0;j<n;j++){
if(i>=coins[j] && f[i - coins[j]] !=Integer.MAX_VALUE){
f[i] = Math.min(f[i-coins[j]]+1,f[i]);
}
}
}
if(f[amount] == Integer.MAX_VALUE){
f[amount]=-1;
}
return f[amount];
}
}
解決:第一に、必要なお金の1量の異なるコインの枚数を格納するために使用される配列を開きます。硬貨の金種の長さを格納するn個の配列が続きます。そして、あなたはゼロドルゼロコインに初期化する必要があります。そして、最初のコインの割り当ての必要数は無限である、forループで伝達方程式を達成するために、価格を比較するために注意する必要は価格与えられたコインの額面金額よりも大きく、コインの必要数は、正の無限大です。*