Leetcode377. 组合总和 Ⅳ -代码随想录

题目:


代码(首刷看解析 2024年2月27日):

class Solution {
public:
    // 思路:动态规划
    int combinationSum4(vector<int>& nums, int target) {
        // 1条件判断:无

        // 2定义dp 初始化 总和为target的数量
        vector<int> dp(target + 1, 0);
        dp[0] = 1;//虚拟,实际dp[0] = 0
        
        // 3遍历 TODO:先target,再nums(不同顺序)
        for (int j = 0; j <= target; ++j) {
            for (int i = 0; i < nums.size(); ++i) {
                if (j - nums[i] >= 0  && dp[j] < INT_MAX - dp[j - nums[i]]) 
                    dp[j] += dp[j - nums[i]]; 
            }
        }
        // 4递推公式:
        return dp[target];
    }
};

代码(二刷看解析 2024年7月11日 go bugfree)

这题和https://leetcode.cn/problems/coin-change-ii/ 是兄弟题,要结合起来看

func combinationSum4(nums []int, target int) int {
    // 1. dp[j]表示总和为j的nums组合的个数
    // 2. dp[j] = dp[j - nums[i]] + dp[j - nums[i - 1]] + ... dp[j - nums[0]]
    // 3. 初始化: 总和为0的组合个数为1,即什么都不装
    dp := make([]int, target + 1)
    dp[0] = 1
    // 4. 遍历顺序,如果先遍历物品的话,结果应该是顺序不同的序列视为同一个组合;所以可能应该先遍历背包容量
    for j := 0; j <= target; j++ {
        for i := 0; i < len(nums); i++ {
            if j - nums[i] >= 0 {
                dp[j] += dp[j - nums[i]]
            }
            fmt.Print("dp[",j,"]:",dp[j]," ")
        }
        fmt.Println("")
    }
    return dp[target]
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值