LeetCode:零錢兌換【322】【DP】
題目描述
給定不同面額的硬幣 coins 和一個總金額 amount。編寫一個函數來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 -1。
示例 1:
輸入: coins =[1, 2, 5], amount =11輸出:3解釋: 11 = 5 + 5 + 1
示例 2:
輸入: coins =[2], amount =3輸出: -1
說明:
你可以認為每種硬幣的數量是無限的。
題目分析
很顯然,這是一道動態規划問題。和第279完全平方數的解法如出一轍。
我們求11的硬幣數,相當於求n=10,n=9,n=6的銀幣數中的最小值+1.
道理明白以后,這里我們倒着填並不是明智的。因為n=10,n=9,n=6的數據都是空的,同樣前面的數也都是空的。
所以我們采取自下而上的填充測略,可以減省空間的消耗。

Java題解
class Solution {
public int coinChange(int[] coins, int amount) {
if(amount==0||coins.length<=0)
return 0;
int[] dp = new int[amount+1];
Arrays.fill(dp,amount+1);
Arrays.sort(coins);
for(int i=1;i<=amount;i++)
{
for(int j=0;j<coins.length;j++)
{
if(i-coins[j]==0)
dp[i]=1;
else if(i-coins[j]>0){
dp[i]=Math.min(dp[i],dp[i-coins[j]]+1);
}
}
}
return dp[amount] > amount ? -1 : dp[amount];
}
}
