leetcode322 零錢兌換
思路:分析可知這是一道完全揹包問題,主要程式碼為
for (int j = 0; j < coins.length; j++) {
if (coins[j] <= i) {
dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1);
}
}
但是要注意邊界情況的處理,首先dp[0]賦值為0,所有元素賦值為最大值+1,這樣在遍歷的時候dp[i](i為coins中元素)=dp[0]+1=1
再討論一下需要返回-1的情況,比如coins為:[2,4] amount為5
這樣在5的迴圈中,首先dp[5]=amount+1=6(初始狀態),然後dp[5]=min(dp[5],d[5-2]+1)即dp[5]=min(6,d[3]+1),dp[3]=min(6,dp[1]+1)=6所以dp[5]=6,可見只要最後dp[amount]>amount就返回-1
public class Solution {
public int coinChange(int[] coins, int amount) {
int max = amount + 1;
int[] dp = new int[amount + 1];
Arrays.fill(dp, max);
dp[0] = 0;
for (int i = 1; i <= amount; i++) {
for (int j = 0; j < coins.length; j++) {
if (coins[j] <= i) {
dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1);
}
}
}
if(dp[amount]>amount) return -1;
return dp[amount];
}
}