代码随想录训练营day45|dp: 322.零钱兑换、279.完全平方数

LeetCode322零钱兑换

class Solution {
    public int coinChange(int[] coins, int amount) {
        /**第二遍:完全背包--最小值(组合问题)
        注意初始化
         */
        int size = coins.length;
        int[] dp = new int[amount+1];
        int max = Integer.MAX_VALUE;
        for(int i=0;i<amount+1;i++){
            dp[i] = max;
        }
        dp[0] = 0;
        for(int i=0;i<size;i++){
            for(int j=coins[i];j<=amount;j++){
                if(dp[j-coins[i]] != max){  // 因为初始化的时候设置了max,所以仍然是max的情况就是没有处理过的。同时也可以在后面表示没有满足情况的组合。
                    dp[j] = Math.min(dp[j-coins[i]]+1, dp[j]);
                }
            }
        }
        if(dp[amount] == max){  // 也可以在后面表示没有满足情况的组合。
            return -1;
        }
        else{
            return dp[amount];
        }
    }
}

LeetCode279:完全平方数

class Solution {
    public int numSquares(int n) {
        /**第二遍:完全背包的最小值问题
        target已经有了
        nums=[i^2]  [1,,4, 9, 16....i^2] i^2<=n
         */
        int[] dp = new int[n+1];
        dp[0] = 0;
        // 组合的情况
        for(int i=1;i<n+1;i++){
            dp[i] = Integer.MAX_VALUE;// 因为要求最小值 所以要将其他的设置为最大值,这样才能算最小值,不然遇到0的,必然是0更小。那么就会是一只是0!!!
        }
        // for(int i=0;i*i
        //     for(int j=i*i;j<=n;j++){
        //         if(dp[j-i*i] != Integer.MAX_VALUE){ // 只有这个数没有被计算过我们才可以进行递归。
        //             dp[j] = Math.min(dp[j-i*i]+1,dp[j]);
        //         }
        //     }
        // }
        // return dp[n];

        // 排列的方法:
        for(int j = 1; j<=n;j++){// 先背包
            for(int i=1;i*i<=j;i++){// 后物品
                dp[j] = Math.min(dp[j-i*i]+1, dp[j]);
            }
        }
        return dp[n];



    }
}

你可能感兴趣的:(LeetCode刷题,算法,leetcode,java)