【问题标题】:Leetcode Target sum of dynamic programmingLeetcode 动态规划的目标和
【发布时间】:2023-03-08 17:16:01
【问题描述】:

给定 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。

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

【问题讨论】:

    标签: algorithm


    【解决方案1】:

    简单修改

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-21
      • 1970-01-01
      • 2017-06-23
      • 2016-07-21
      • 1970-01-01
      相关资源
      最近更新 更多