目录
Leecode 70.爬楼梯
题目地址:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题目类型:完全背包
class Solution {
public:
int climbStairs(int n) {
// 由于是求次数,可以转化为完全背包问题,即走一个台阶或者走两个台阶可以被选择
// dp[i]代表当高度为i时,总的组合数目
vector<int> dp(n + 1);
dp[0] = 1;
// 有顺序要求,先背包,后物品
for (int i = 0; i <= n; ++i) {
// 由于物品只有两种可能,所以不需要for循环
if (i >= 1) dp[i] += dp[i - 1];
if (i >= 2) dp[i] += dp[i - 2];
}
return dp[n];
}
};
Leecode 322.零钱兑换
题目地址:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题目类型:完全背包
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
// 完全背包,求最少数量
// dp[i]代表组成i块钱所需要的最少组合数
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] = min(dp[j], dp[j - coins[i]] + 1);
}
}
return dp[amount] == INT_MAX ? -1 : dp[amount];
}
};
Leecode 279.完全平方数
题目地址:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题目类型:完全背包
class Solution {
public:
int numSquares(int n) {
// 完全背包,不在乎遍历顺序(先物品,再背包)
// dp[i]代表,容量为i时的完全平方数的最少数量
vector<int> dp(n + 1, INT_MAX);
dp[0] = 0;
for (int i = 0; i < 100; ++i) {
int temp = i * i;
for (int j = temp; j <= n; ++j) {
if (dp[j - temp] < INT_MAX) dp[j] = min(dp[j], dp[j - temp] + 1);
}
}
return dp[n];
}
};