70. 爬楼梯
class Solution {
public:
// 进阶
int climbStairs(int n) {
if (n <= 2) return n;
vector<int> dp(n + 1, 0);
dp[0] = 1;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= 2; j++) { // 此处2为每次爬台阶的最大数
if (i - j >= 0) 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); // 不同位置最少的硬币个数
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] = std::min(dp[j], dp[j-coins[i]] + 1);
} else {
// 无法组合
}
}
}
return (dp[amount] != INT_MAX ? dp[amount] : -1);
}
};
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] = std::min(dp[j], dp[j - i * i] + 1);
}
}
return dp[n];
}
};