当前位置: 首页 > 知识库问答 >
问题:

从正数和负数集合中找出所有可能的等于0的子集和?[副本]

穆毅然
2023-03-14

如果有一个包含一组正数和负数的数组,请打印所有等于0的子集和。

我可以想出一种方法,在那里我可以制作givcen阵列的所有功率集,并检查它们的总和是否为0。但对我来说,这不像是优化的解决方案。

看完网上看起来有点类似的问题,好像可以用下面的程序动态编程来解决,看看是否有组合存在,让和11只是一个例子?

public boolean subsetSum(int input[], int total) {

        boolean T[][] = new boolean[input.length + 1][total + 1];
        for (int i = 0; i <= input.length; i++) {
            T[i][0] = true;
        }

        for (int i = 1; i <= input.length; i++) {
            for (int j = 1; j <= total; j++) {
                if (j - input[i - 1] >= 0) {
                    T[i][j] = T[i - 1][j] || T[i - 1][j - input[i - 1]];
                } else {
                    T[i][j] = T[i-1][j];
                }
            }
        }
        return T[input.length][total];

    }




public static void main(String args[]) {
    TestDynamic ss = new TestDynamic();
   int arr1[] = {2, 3, 7, 8};
    System.out.print(ss.subsetSum(arr1, 11));

}

但是我不知道如何将上述程序扩展到

1)包括负数
2)找到使和为零的元素组合(上面的程序只是发现它是否可以使给定的和,但没有找到哪一组数字使它为零)

共有1个答案

佘京
2023-03-14

下面是Javascript的完整实现。您可以使用节点运行它。js。

function target_sum(a, k, x)
{
    if (k == a.length) return [];
    if (a[k] == x) {
        return [[a[k]]];
    } else {
        var s = target_sum(a, k + 1, x);        // not using a[k]
        var t = target_sum(a, k + 1, x - a[k]); // using a[k]
        for (var i = 0; i < t.length; ++i) {
            t[i].unshift(a[k]); // a[k] is part of the solution
            s.push(t[i]);       // merge t[] into s[]
        }
        return s;
    }
}

var s = target_sum([1,4,5,2,7,8,-3,-5,-6,9,3,-7,-1,5,6], 0, 0);
for (var i = 0; i < s.length; ++i)
    console.log(s[i].join(","));

注意这是指数算法,不要在大数组上使用。

欧文·鲁伊贾克斯也指出了正确的方向。特别是,这篇文章给出了另一种算法。我可能在以下几点上错了——我认为算法以速度换取空间。它避免了将数组转移到调用堆栈中,但必须执行更多的递归才能实现这一点。

编辑:关于你提到的算法。它不是指数型的,但如果我是对的,它只适用于正数。它的时间复杂度也与目标和成比例,目标和根据输入可能不理想。

 类似资料:
  • 我一直在学习动态规划,我想通过打印出所有相加为一个数字的子集来进一步研究经典的子集和问题。我该怎么做呢?到目前为止,我知道如何根据是否存在相加的子集来打印true或false 如果可能,我想返回所有子集的数组。

  • 问题内容: 我需要获取数组的所有可能的子集,其中至少要包含2个项目,而最大未知数。有人可以帮助我一点吗? 说我有这个… …我怎么得到这个? 问题答案: 窃取此JavaScript组合生成器后,我添加了一个参数以提供最小长度,从而, 要使用,提供一个数组以及所需的最小子集长度, 输出是

  • 我知道这是子集和问题的一个变体,我也见过类似问题的一些解决方案(带负数的子集和),但我需要用动态规划来解决这个问题。我见过的大多数解决方案都使用递归,而不是DP。 我想我需要一个大小为(n*n*d)的3d布尔表S(I,j,k)。但是S(i,j,k)什么时候为真,什么时候为假?因为我总是需要检查使用k个数计算和的所有可能方法,这些方法既可以是正数,也可以是负数(例如:对于4个数{1,2,3,4},有

  • 给定一个由N个元素组成的数组,找出数组的所有子集,其和等于目标值。 我已经看到了所有关于子集和的老问题,但没有一个对我有用。 输入的第一行包含数组的整数N大小 第二行包含由空格分隔的数组元素 目标和值 打印所有子数组(元素索引)。 我的代码对于小的输入工作得很好,但是对于N>150则需要很长的时间。有没有其他有效的算法可以做到这一点。请告诉我如何优化此代码以适应较大的输入。 这是我的代码 需要花费

  • 我可以搜索eqaul到k之和的子数组中的正数,但下面的代码无法搜索数组中的负数。对于数组中的负数和正数,有没有找到给定和的子数组的算法? 例如,{10,2,-2,-20,10},在这个数组中查找sum为-10的子数组。子数组在这种情况下是{-20,10}。

  • 假设我有一个从0到9的20个随机整数的列表。我想把列表分成子集,这样子集和等于给定值的比率,我想找到所有可能的分区。我写了下面的代码,并让它在的情况下工作。 输出: 如果你计算每个子集的总和,你会发现比率是44: 33 = 4: 3的,这正是输入值。但是,我希望该函数适用于任意数量的子集。比如说我希望 返回像这样的东西 我已经思考这个问题一个月了,我发现这非常困难。我的结论是这个问题只能通过递归来