70. 爬楼梯(进阶版)
题目链接:57. 爬楼梯(第八期模拟笔试)
文档讲解:代码随想录
思路
完全背包问题,物品为每次可以爬的台阶数,背包容量为所需要爬的台阶数,求装满该背包有多少种方法,而且需要考虑顺序。
代码
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
vector<int> dp(n + 1, 0);
dp[0] = 1;
for (int i = 0; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (i >= j)
dp[i] += dp[i - j];
}
}
cout << dp[n] << endl;
return 0;
}
322. 零钱兑换
题目链接:322. 零钱兑换
文档讲解:代码随想录
思路
完全背包问题,dp[j] = min(dp[j-coins[i]] + 1, dp[j]),即钱数减去当前硬币的金额所需要的最小硬币数再加一,并且取最小值
代码
class Solution {
public:
int coinChange(vector<int> &coins, int amount) {
vector<int> dp(amount + 1, INT32_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]] != INT32_MAX)
dp[j] = min(dp[j], dp[j - coins[i]] + 1);
}
}
return dp[amount] == INT32_MAX ? -1 : dp[amount];
}
};
279.完全平方数
题目链接:279.完全平方数
文档讲解:代码随想录
思路
与上一题类似,完全背包问题。
代码
class Solution {
public:
int numSquares(int n) {
int range = sqrt(n) + 1;
vector<int> dp(n + 1, INT_MAX);
dp[0] = 0;
for (int i = 1; i < range; i++) {
for (int j = i * i; j <= n; j++) {
if (dp[j - i * i] != INT_MAX)
dp[j] = min(dp[j], dp[j - i * i] + 1);
}
}
return dp[n];
}
};