Leetcode 动态规划的目标和

Posted

技术标签:

【中文标题】Leetcode 动态规划的目标和【英文标题】:Leetcode Target sum of dynamic programming 【发布时间】:2021-04-12 17:31:50 【问题描述】:

给定 ntarget,求 [1,2,...,n] 中的 number 的组合数加起来为 target。数字可以重复选择(1 + 1 + 2 = 4),但组合不能重复(1,1,2 和 1,2,1 视为一个组合)。例如

n = 2, target = 4: 1,1,1,1, 1,1,2, 1,3, 2,2,所以返回 4

由于我们只需要返回组合的数量,我们使用动态规划如下:

int sum(int n, int target) 
    vector<int> dp(target + 1);
    dp[0] = 1;
    for (int i = 1; i <= target; ++i) 
        for (int j = 1; j <= n; j++) 
            if (i >= j) dp[i] += dp[i - j];
        
    
    return dp.back();

但是,此解决方案适用于重复组合:1,1,1,1、1,1,2、1,2,1、2,1,1、1,3 , 3,1 2,2,所以返回 7。

您知道如何修改它以删除重复项吗?

【问题讨论】:

【参考方案1】:

简单修改

  for (int j = 1; j <= n; j++) 
        for (int i = j; i <= target; i++) 
            dp[i] += dp[i - j];
        
    

有助于避免在较大的值之后使用较小的值,因此代码只计算已排序的组合

Alike question 具有特定硬币名义而不是 1..n 值

【讨论】:

以上是关于Leetcode 动态规划的目标和的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 1449 数位成本和为目标的最大数字[动态规划] HERODING的LeetCode之路

动态规划解题(leetcode322零钱兑换)

动态规划——在数组中找到目标求和方式

LeetCode 1074 元素和为目标值的子矩阵数量[动态规划 前缀和 暴力] HERODING的LeetCode之路

Leetcode 动态规划刷题总结

Leetcode动态规划简单题