class Solution {
public:
int climbStairs(int n) {
vector<int>dp(n+1,0);
dp[0]=1;
for(int j=0;j<=n;j++){
for(int i=1;i<=2;i++){
if(j>=i) dp[j]+=dp[j-i];
}
}
return dp[n];
}
};
这个题还是说想清楚 这个因为有1和2 阶的情况 所以i就是从1开始遍历 然后小于等于2 就是1和2这两种情况
// 版本一
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 - coins[i]]是初始值则跳过dp[j] = min(dp[j - coins[i]] + 1, dp[j]);}}}if (dp[amount] == INT_MAX) return -1;return dp[amount];}
};
这个第二题主要就是那个if判断 之前为什么不用加呢 因为之前都是初始化为0 因此加不加没影响 但是你现在设置为这个最大值 一是会导致溢出 二是你会改变dp[j]的值 主要是你会改变dp[j]初始化的值 后面就会造成一系列的错误
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]!=INT_MAX)
dp[j]=min(dp[j],dp[j-i*i]+1);
}
}
return dp[n];
}
};