Day45 动规 完全背包 70 322 279

61 阅读1分钟

70. 爬楼梯

心得

  • 有点感觉了

题解

  • 进阶爬楼梯,改成每次可以爬1-m阶,完全背包问题,遍历顺序重要
class Solution {
public:
    int climbStairs(int n) {
        vector<int> dp(n + 1, 0); //dp[i] 表示爬到第i个台阶有dp[i]种爬法
        dp[0] = 1; // 0号位是所有的数值基础,推理可以得0,其他非0置0才不会影响
        int m = 2;
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) { // m种跳法
                if (i - j >= 0) dp[i] += dp[i - j];
            }
        }
        return dp[n]; 
    }
};

322. 零钱兑换

心得

  • 直接套用完全背包问题,没想清楚

题解

  • 由于求得是最小,初始值赋最大,考虑当前取到coin[i]时情况
  • 遍历顺序题中为明确表示,无影响
class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        vector<int> dp(amount + 1, INT_MAX); // 凑足总额为i 最少需要dp[i]种方法,不被覆盖初始化最大值
        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) { // 跳过初值,也可以i = 1可以不同该行
                    dp[j] = min(dp[j], dp[j - coins[i]] + 1); // 求的是硬币个数,所以此处 + 1
                }
            }
        }
        if (dp[amount] == INT_MAX) return -1;
        return dp[amount];
    }
};

279. 完全平方数

心得

  • 不了解完全平方数如何求,其实只要遍历开根号即可

题解

  • 转换题意,完全平方数即为物品,背包容量即为n,
  • 遍历顺序无影响,跟零钱那一题基本一致
class Solution {
public:
    int numSquares(int n) {
        vector<int> dp(n + 1, INT_MAX); // dp[i] 和为i的完全平方数的最少数量
        dp[0] = 0;
        for (int i = 1; i * i <= n; i++) { // 物品
            for (int j = i * i; j <= n; j++) { // 背包
                 
                 dp[j] = min(dp[j], dp[j - i * i] + 1);
                
            }
        }
        return dp[n];
    }
};