代码随想录算法训练营第45天 | 动态规划 完全背包 LeetCode70. 爬楼梯 (进阶),322. 零钱兑换,279.完全平方数

@代码随想录算法训练营第45天 | 动态规划 完全背包 LeetCode70. 爬楼梯 (进阶),322. 零钱兑换,279.完全平方数

70. 爬楼梯 (进阶)

第一遍读题思考

完全背包加组合背包,组合背包的递推公式加上完全背包的遍历顺序。

代码随想录解法思路

一样。

c++代码具体实现注意事项

要注意遍历物品的时候只能走1或者2步。

class Solution {
public:
    int climbStairs(int n) {
        vector<int> dp(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];
    }
};

322. 零钱兑换

第一遍读题思考

完全背包加组合背包,组合背包的递推公式加上完全背包的遍历顺序。

代码随想录解法思路

一样。

c++代码具体实现注意事项

每次迭代去最小值,初始化数组为最大值。
先遍历背包,再遍历物品其实是求排列的问题,但是这里是取min所以也是可以,但是比先遍历物品的要多出一些不必要的迭代操作。
背包从前往后遍历表示可以重复放物品。

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        vector<int> dp(amount+1, INT_MAX);
        dp[0] = 0;
        for(int j=0;j<=amount;j++)
            for(int i=0;i<coins.size();i++)
        {
            if(j>=coins[i] && dp[j-coins[i]]!=INT_MAX) dp[j] = min(dp[j], dp[j-coins[i]] + 1);
        }
        if (dp[amount] == INT_MAX) return -1;
        return dp[amount];
    }
};

279.完全平方数

第一遍读题思考

直接先遍历背包,然后正序遍历

代码随想录解法思路

一样。

c++代码具体实现注意事项

class Solution {
public:
    int numSquares(int n) {
        vector<int> dp(n+1, INT_MAX);
        dp[0] = 0;
        for(int j=0;j<=n;j++)
            for(int i=1;i<=100;i++)
        {
            if(j>=(i*i) ){
                dp[j] = min(dp[j], dp[j-i*i]+1);
            }
        }
        return dp[n];
    }
};

你可能感兴趣的:(算法,动态规划,leetcode)