一、70.爬楼梯
代码如下:
class Solution {
public:
int climbStairs(int n) { // 完全背包的排序问题
vector<int> dp(n + 1, 0);
dp[0] = 1;
for (int i = 0; i <= n; i ++) {
for (int j = 1; j <= 2; j++) { // 2改成m就是每次至少可以爬m阶台阶
if (i >= j) dp[i] += dp[i - j];
}
}
return dp[n];
}
};
二、322.零钱兑换
代码如下:
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
vector<int> dp(amount + 1, INT_MAX); // 背包容量是amount
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] = min(dp[j - coins[i]] + 1, dp[j]); // dp的下标是跟背包一样的
}
}
if (dp[amount] == INT_MAX) return -1;
return dp[amount];
}
};
三、279.完全平方数
代码如下:
class Solution {
public:
int numSquares(int n) {
vector<int> dp(n + 1, INT_MAX);
dp[0] = 0;
for (int i = 1; i * i <= n; i++) { // 物品
for (int j = i * i; j <= n; j++) { // 背包
dp[j] = min(dp[j - i * i] + 1, dp[j]);
}
}
return dp[n];
}
};
j直接从ii开始,不需要判断j是否大于ii。本身j<i*i时也没有遍历的意义,空间不够怎么放咯。