Day44 | 518. 零钱兑换 II | 377. 组合总和 Ⅳ

 518. 零钱兑换 II

注意点:
1.完全背包问题遍历顺序中先物品后背包是组合问题,先背包后物品是排序问题,本题显然是组合问题

2.递推公式和494. 目标和 的递推公式是一样的

class Solution {
public:
    int change(int amount, vector& coins) {
    //    1. dp[j]数组的含义是:当amouont为j时,凑成j的方法为为dp[j]
        vector dp(amount+1, 0);
        // 3.初始化的话将amount = 1, coins = [1]代入 dp[1] += dp[0]->dp[1] = dp[1] + dp[0] = 0 + dp[0] = 1,所以dp[0] = 1;
        dp[0] = 1;
        // 4.由于本题是组合问题,所以采用的是先物品后背包
        for(int i =0; i < coins.size(); i++) {
            for(int j = coins[i]; j <= amount; j++) {
                // 2.递推公式
                dp[j] += dp[j-coins[i]];
            }
            // cout << dp[0]<

377. 组合总和 Ⅳ

注意点:
1. C++测试用例有两个数相加超过int的数据,所以需要在if里加上dp[j] < INT_MAX - dp[j - num]

2.和  518. 零钱兑换 II 不同的是这个题目是排序问题,所以是先背包后物品

class Solution {
public:
    int combinationSum4(vector& nums, int target) {
    //    1. dp[j]数组的含义是:当target为j时,凑成j的方法为为dp[j]
        vector dp(target+1, 0);
        // 3.初始化的话将target = 1, nums = [1]代入 dp[1] += dp[0]->dp[1] = dp[1] + dp[0] = 0 + dp[0] = 1,所以dp[0] = 1;
        dp[0] = 1;
        // 4.由于本题是组合问题,所以采用的是先背包后物品
        
         for(int j = 0; j <= target; j++) {
            for(int i =0; i < nums.size(); i++) {
                // 2.递推公式,因为有数据相加大于INT_MAX的值,所以需要在if循环中添加dp[j] < INT_MAX- dp[j-nums[i]]
                if(j >= nums[i] && dp[j] < INT_MAX- dp[j-nums[i]]) dp[j] += dp[j-nums[i]];
            }
        }
        return dp[target];
    }
};

 

你可能感兴趣的:(刷题,动态规划,c++,算法)