零和子集的数量 - 结果的解释

问题描述 投票:0回答:1

下面的代码是关于使用子集零和算法的动态规划。

换句话说,它告知在添加元素时有多少子集总和为零。

但是,如果集合为 [2, -2],结果将为 2,因为有两个总和为零的子集:{}(空集)和 {2, -2}。

但是如果我们将集合更改为 [2, 2],结果仍然是 2。

这是什么解释,对我来说应该是1?

JavaScript 代码取自网站 geeksforgeeks

    const arr = [2, 2];
    const n = arr.length;
    const maxSum = 3;
    
    const dp = new Array(n + 1);
    for (let i = 0; i <= n; i++) {
      dp[i] = new Array(2 * maxSum + 1).fill(0);
    }
    
    for (let i = 0; i <= n; i++) {
      dp[i][maxSum] = 1;
    }
    
    for (let i = 1; i <= 2 * maxSum; i++) {
      dp[0][i] = 0;
    }
    
    for (let i = 1; i <= n; i++) {
      for (let j = -maxSum; j <= maxSum; j++) {
        const val = arr[i - 1];
        if (j - val + maxSum >= 0 && j - val + maxSum <= 2 * maxSum) {
          dp[i][j + maxSum] += dp[i - 1][j - val + maxSum];
        }
    
        if (j + maxSum >= 0 && j + maxSum <= 2 * maxSum) {
          dp[i][j + maxSum] += dp[i - 1][j + maxSum];
        }
      }
    }
    console.log(dp)
    console.log(dp[n][maxSum])
dynamic-programming subset-sum
1个回答
0
投票

动态规划-DP

我在问题中发布的代码不适用于 DP - Tabulation,它仅适用于 Memoization,可在网站 geeksforgeeks 上找到。如果答案大于 1,则意味着存在一个总和为零的子集,但它不适用于浮点数。

但是,我设法创建了决策代码来确定该集合是否有等于零的总和,并且它是使用 DP - 制表来实现的。

该代码适用于负整数和浮点数。

function subsetSumZero() {
    const list = [-10, 100, -13579.1, -4, 13589.1];

    let sum = [];

    if (sum.length === 0) {
        sum.push(list[0]);
    }

    for (let i = 1; i < list.length; i++) {
        sum.push(list[i]);
        let temp = [];

        for (let j = 0; j < sum.length - 1; j++) {
            let summation = sum[j] + list[i];

            if (summation === 0) {
                return true;
            }

            temp.push(summation);
        }
        sum.push(...temp);
    }

    return false;
}
© www.soinside.com 2019 - 2024. All rights reserved.