零钱兑换
需要注意初始化,以及返回条件。
int coinChange(vector<int>& coins, int amount) {
vector<int> dp(amount + 1, amount+1);
dp[0] = 0;
for(int i = 0; i < coins.size(); i++){
for(int j = 0; j <= amount; j++){
if(j >= coins[i])
dp[j] = min(dp[j], dp[j - coins[i]] + 1);
}
}
if (dp[amount] == amount+1) return -1;
return dp[amount];
}
完全平方数
完全背包,思路还是一样的
int numSquares(int n) {
vector<int> bags;
for(int i = 1; i*i <= n; i++){
bags.push_back(i*i);
}
vector<int> dp(n + 1, n + 1);
dp[0] = 0;
for(int i = 0; i < bags.size(); i++){
for(int j = 0; j <= n; j++){
if(j >= bags[i])
dp[j] = min(dp[j], dp[j - bags[i]] + 1);
}
}
return dp[n];
}
爬楼梯(进阶版)
不只是只能爬1、2阶楼梯了,而是一次可以爬最大m阶楼梯。
#include<iostream>
#include<vector>
using namespace std;
int main(){
int m;
int n;
cin>>n>>m;
vector<int> dp(n + 1, 0);
dp[0] = 1;
for(int j = 1; j <= n; j++){
for(int i = 1; i <= m; i++){
if(j >= i)
dp[j] += dp[j - i];
}
}
cout << dp[n] << endl;
return 0;
}