零钱兑换 II (Coin Change II)

 

思路:完全背包

// @Title: 零钱兑换 II (Coin Change II)
// @Author: qisiii
// @Date: 2024-09-26 19:49:39
// @Runtime: 8 ms
// @Memory: 47.9 MB
// @comment: 完全背包
// @flag: GREEN
class Solution {
    public int change(int amount, int[] coins) {
        // dp[i][j]代表的是0-i个金额任取刚好达到j的次数
        int[][] dp = new int[coins.length][amount + 1];
        //第一行只能可以模除成功,就代表一定能达到
        for(int j=0;j<=amount;j++){
            if(j%coins[0]==0){
                dp[0][j]=1;
            }
        }
        //不选也是一种方案,之所以初始化为1,是假如[1,2] 2的情况,只有11和2这两种方案,
        //11代表的是dp[i - 1][j],2则是dp[i][j - coins[i]]
        for(int i=0;i<coins.length;i++){
            dp[i][0]=1;
        }
        for (int i = 1; i < coins.length; i++) {
            for (int j = 1; j <= amount; j++) {
                if (coins[i] > j) {
                    dp[i][j] = dp[i - 1][j];
                } else {
                    dp[i][j] = dp[i - 1][j] + dp[i][j - coins[i]];
                }
            }
        }
        return dp[coins.length-1][amount];
    }
}
Licensed under CC BY-NC-SA 4.0
最后更新于 2024-10-18