目录
70 爬楼梯(进阶)
#include<iostream>
#include<vector>
using namespace std;
int main(){
int n, m;
cin >> n >> m;
//dp数组表示可以到达这个台阶方法数
vector<int> dp(n+1, 0);
dp[0] = 1;
for(int i = 1; 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 零钱兑换
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
//dp数组表示凑成amount的最少个数
vector<int> dp(amount + 1, INT_MAX);
dp[0] = 0;
for(int i = 1; i <= amount; i++){//背包 = amount(目标数)
for(int j = 0; j < coins.size(); j++){//物品 = 硬币
if(i - coins[j] >= 0 && dp[i - coins[j]] != INT_MAX){//
dp[i] = min(dp[i - coins[j]] + 1, dp[i]);
}
}
}
if(dp[amount] == INT_MAX) return -1;
return dp[amount];
}
};
279 完全平方数
class Solution {
public:
int numSquares(int n) {
//dp数组代表能够实现j这个数值的最少步数
vector<int> dp(n+1, INT_MAX);
vector<int> arr;
dp[0] = 0;
for(int i = 1; i <= n; i++){
if(i*i <= n){
arr.push_back(i*i);
}
}
//这题求的是最少个数,元素怎么排不关心,所以我们可组合可排列
for(int i = 0; i < arr.size(); i++){//物品
for(int j = arr[i]; j <= n; j++){//背包
dp[j] = min(dp[j], dp[j - arr[i]] + 1);
}
}
return dp[n];
}
};