代码随想录 DAY45

class Solution {

public:

    int climbStairs(int n) {

        vectordp(n+1,0);

        dp[0]=1;

        for(int j=0;j<=n;j++){

            for(int i=1;i<=2;i++){

                if(j>=i) dp[j]+=dp[j-i];

            }

        }

        return dp[n];

    }

};

这个题还是说想清楚 这个因为有1和2 阶的情况 所以i就是从1开始遍历 然后小于等于2 就是1和2这两种情况

// 版本一
class Solution {
public:
    int coinChange(vector& coins, int amount) {
        vector dp(amount + 1, INT_MAX);
        dp[0] = 0;
        for (int i = 0; i < coins.size(); i++) { // 遍历物品
            for (int j = coins[i]; j <= amount; j++) { // 遍历背包
                if (dp[j - coins[i]] != INT_MAX) { // 如果dp[j - coins[i]]是初始值则跳过
                    dp[j] = min(dp[j - coins[i]] + 1, dp[j]);
                }
            }
        }
        if (dp[amount] == INT_MAX) return -1;
        return dp[amount];
    }
};

这个第二题主要就是那个if判断 之前为什么不用加呢 因为之前都是初始化为0 因此加不加没影响 但是你现在设置为这个最大值 一是会导致溢出 二是你会改变dp[j]的值 主要是你会改变dp[j]初始化的值 后面就会造成一系列的错误 

class Solution {

public:

    int numSquares(int n) {

        vector dp(n+1,INT_MAX);

        dp[0]=0;

        for(int i=1;i*i<=n;i++){

            for(int j=i*i;j<=n;j++){

                if(dp[j-i]!=INT_MAX)

                dp[j]=min(dp[j],dp[j-i*i]+1);

            }

        }

        return dp[n];

    }

};

 

你可能感兴趣的:(算法,数据结构,java)