0
点赞
收藏
分享

微信扫一扫

测试技术体系

水沐由之 2023-06-28 阅读 80

Day45

70. 爬楼梯(完全背包)

题目链接:70. 爬楼梯

for (int j = 0; j <= n; ++j)

因为dp[0]可以通过递推公式得到,因此j可以从0开始。通常是从int j = 1开始。

class Solution {
public:
    int climbStairs(int n) {
        vector<int> dp{1};
        dp.resize(n + 1);
        for (int j = 0; j <= n; ++j) {//因为dp[0]可以通过递推公式得到,因此j可以从0开始
            for (int i = 1; i <= 2; ++i) {//只能迈i个台阶,i = 1,2
                if (j - i >= 0)
                    dp[j] += dp[j - i];
            }
        }
        return dp.back();
    }
};

322. 零钱兑换

题目链接:322. 零钱兑换

dp数组的含义:装满容量为 j 的背包,需要的最少个数为 dp[j]

递推公式:dp[j] = min(dp[j], dp[j - coins[i]] + 1)

初始化:因为求的是最小值min,因此需要将非零的初始值设置为 INT_MAXdp[0] = 0。(之前的递推公式为max时,为了满足max函数,因此不用初始化,或者初始化为零)

构造dp数组类型为vector<unsigned>

class Solution {
public:
   int coinChange(vector<int>& coins, int amount) {
       vector<unsigned/*满足INT_MAX + 1*/> dp(amount + 1, INT_MAX);
       dp[0] = 0;
       for (int i = 0; i < coins.size(); ++i) {
           for (int j = coins[i]; j <= amount; ++j) {
               dp[j] = min(dp[j], dp[j - coins[i]] + 1);
           }
       }
       return dp.back() == INT_MAX ? -1 : dp.back();
   }
};

或者使用if (dp[j - coins[i]] != INT_MAX)直接剔除超过INT_MAX

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)//因为使用了INT_MAX + 1,剔除溢出int的部分
                    dp[j] = min(dp[j], dp[j - coins[i]] + 1);
            }
        }
        return dp.back() == INT_MAX ? -1 : dp.back();
    }
};

279.完全平方数

题目链接: 279.完全平方数

for (int i = 1; i * i <= n; ++i)

用来构造完全平方数的数组。

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/*为了避免dp[j - i * i]非法*/; j <= n; ++j) {
                dp[j] = min(dp[j], dp[j - i * i] + 1);
            }
        }
        return dp.back();
    }
};

举报

相关推荐

0 条评论