题目1:57. 爬楼梯(第八期模拟笔试) (kamacoder.com)
当时爬楼梯只有 1,2两种情况所以可以用斐波那契数列做,当上楼的阶梯数为n时,可以抽象成完全背包问题,这里题目要求时排列,所以应该是先遍历背包,再遍历物品,这样 可以包含 1、2 和 2、 1
#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 j = 0;j <= n;j++) {
for(int i = 1;i <= m;i++) {
if(j - i >= 0) dp[j] += dp[j - i];
}
}
cout << dp[n] << endl;
return 0;
}
初始化没有想到,递推公式想到了
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] = min(dp[j - coins[i]] + 1, dp[j]);
}
}
if(dp[amount] == INT_MAX) return -1;
return dp[amount];
}
};
这里主要是物品没想白怎么表示,想的是根据n 把能取到的完全平方数列出来,再进行遍历,但是解法里的遍历就很巧妙
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++) {
if(dp[j - i * i] != INT_MAX)
dp[j] = min(dp[j], dp[j - i * i] + 1);
}
}
if(dp[n] == INT_MAX) return -1;
return dp[n];
}
};