leetcode322 零錢兌換

vast_joy發表於2024-09-27

leetcode322 零錢兌換

image-20240927001636548

思路:分析可知這是一道完全揹包問題,主要程式碼為

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];
    }
}

相關文章