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

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

代码随想录算法训练营第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];}
};