題目以下數組
示例 1:
輸入: amount = 5, coins = [1, 2, 5]
輸出: 4
解釋: 有四種方式能夠湊成總金額:
5=5
5=2+2+1
5=2+1+1+1
5=1+1+1+1+1
示例 2:
輸入: amount = 3, coins = [2]
輸出: 0
解釋: 只用面額2的硬幣不能湊成總金額3。
示例 3:
輸入: amount = 10, coins = [10]
輸出: 1
複製代碼
解題思路以下: 採用動態規劃 已知硬幣面值coins[],用這些硬幣湊成指定的金額amount。要求硬幣個數最少。 設金額amount對應的最少硬幣個數爲:f(amount) 自上而下推,咱們能夠這樣想,金額amount對應的最少硬幣數f(amount),確定是由另外一個金額加上一個已有的硬幣面值來的。 能夠得出: f(amount) = min(f(amount-coins[0]),f(amount-coins[1])…)+1 代碼markdown
解題思路是從上向下,可是按照這個思路寫代碼時,會比較麻煩。能夠考慮自下而上的方式。
初始化數組dp[amount+1],下標表示金額,值爲最少硬幣數。
dp[coins[0]]=dp[coins[i]]=…=1
由初始化後的數組,可推出以後全部的金額的最少硬幣數。
複製代碼
public static void main(String[] args) {
//採用動態規劃
/**
* 已知硬幣面值coins[],用這些硬幣湊成指定的金額amount。要求硬幣個數最少。
設金額amount對應的最少硬幣個數爲:f(amount)
自上而下推,咱們能夠這樣想,金額amount對應的最少硬幣數f(amount),確定是由另外一個金額加上一個已有的硬幣面值來的。
能夠得出:
f(amount) = min(f(amount-coins[0]),f(amount-coins[1])…)+1
代碼
解題思路是從上向下,可是按照這個思路寫代碼時,會比較麻煩。能夠考慮自下而上的方式。
初始化數組dp[amount+1],下標表示金額,值爲最少硬幣數。
dp[coins[0]]=dp[coins[i]]=…=1
由初始化後的數組,可推出以後全部的金額的最少硬幣數。
dp[i+coins[n]] = dp[i+coins[n]]>dp[i]+1?dp[i]+1:dp[i+coins[n]];
*/
int amount = 6;
int coins[] ={1,2,5};
//1*6 1*4+2 1*2+2*25*1
int result =new Solution().change(amount,coins);
System.out.println(result);
}
static class Solution{
public int change(int amount, int[] coins) {
int dp[] = new int[amount+1];
// 設置起始狀態
dp[0] = 1;
for (int coin : coins) {
// 記錄每添加一種面額的零錢,總金額j的變化
for (int j = 1; j <= amount; j++) {
if (j >= coin) {
// 在上一鍾零錢狀態的基礎上增大
// 例如對於總額5,當只有面額爲1的零錢時,只有一種可能 5x1
// 當加了面額爲2的零錢時,除了原來的那一種可能外
// 還加上了組合了兩塊錢的狀況,而總額爲5是在總額爲3的基礎上加上兩塊錢來的
// 因此就加上此時總額爲3的全部組合狀況
dp[j] = dp[j] + dp[j - coin];
}
}
return dp[amount];
}
}
複製代碼