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

返回其和为给定值的所有子集(子集和问题)

公良高刚
2023-03-14
const subsetSum = (array, sum) => {
   // Initialize empty 2D boolean array.
   let subsetArray = new Array(array.length)
      .fill(false)
      .map(() => new Array(sum + 1).fill(false));

   for (let e = 0; e < array.length; e++) {
      for (let s = 0; s <= sum; s++) {
         if (s === 0 || s === array[e]) {
            subsetArray[e][s] = true;
            continue;
         }
         if (e > 0) {
            if (
               subsetArray[e - 1][s] === true ||
               subsetArray[e - 1][s - array[e]] === true
            ) {
               subsetArray[e][s] = true;
            }
         }
      }
   }
   return subsetArray;
};

我的问题是,我需要从这个布尔数组中提取和等于指定和的实际子集。我尝试过这样做,但是我的方法中的逻辑(涉及到使用布尔数组来减少我必须分析的子集的数量)变得相当复杂,并且我很难实现它。

有没有人知道当使用subsetsum生成的布尔数组时,找到其和等于给定和的所有子集的好方法?

编辑%1

输入

Sum: 17
Array 7 2 1 5 1 20 7

输出

7 7 2 1

共有1个答案

颜畅
2023-03-14

您可以采用迭代和递归的方法来寻找子集和。

这种方法返回两个集合,因为有两个集合。

它的工作方式是从数组中取值或不取值。

如果索引的值等于数组的长度,则recusrion将停止。

最后一次检查向前看,如果和小于或等于目标和,则取实际索引i处的项进行下一次递归。

fork的最后一次调用省略了实际项,并继续下一个索引。

DR

取一个元素,构建和或省略该元素。然后继续下一个索引。

取数示例:

7
7 2
7 2 1
7 2 1 5
7 2 1 5 1
7 2 1 5 1
7 2 1 5 1
7 2 1 5
7 2 1 5
7 2 1 5
7 2 1
7 2 1 1
7 2 1 1
7 2 1 1
7 2 1
7 2 1
7 2 1 7
7 2 1
7 2
7 2 5
7 2 5 1
7 2 5 1
7 2 5 1
7 2 5
7 2 5
7 2 5
7 2
7 2 1
7 2 1
7 2 1 7
7 2 1
7 2
7 2
7 2 7
7 2
7
7 1
7 1 5
7 1 5 1
7 1 5 1
7 1 5 1
7 1 5
7 1 5
7 1 5
7 1
7 1 1
7 1 1
7 1 1 7
7 1 1
7 1
7 1
7 1 7
7 1
7
7 5
7 5 1
7 5 1
7 5 1
7 5
7 5
7 5
7
7 1
7 1
7 1 7
7 1
7
7
7 7
7

2
2 1
2 1 5
2 1 5 1
2 1 5 1
2 1 5 1 7
2 1 5 1
2 1 5
2 1 5
2 1 5 7
2 1 5
2 1
2 1 1
2 1 1
2 1 1 7
2 1 1
2 1
2 1
2 1 7
2 1
2
2 5
2 5 1
2 5 1
2 5 1 7
2 5 1
2 5
2 5
2 5 7
2 5
2
2 1
2 1
2 1 7
2 1
2
2
2 7
2

1
1 5
1 5 1
1 5 1
1 5 1 7
1 5 1
1 5
1 5
1 5 7
1 5
1
1 1
1 1
1 1 7
1 1
1
1
1 7
1

5
5 1
5 1
5 1 7
5 1
5
5
5 7
5

1
1
1 7
1


7
function getSubsets(array, sum) {

    function fork(i = 0, s = 0, t = []) {
        if (s === sum) {
            result.push(t);
            return;
        }
        if (i === array.length) {
            return;
        }
        if (s + array[i] <= sum) { // shout circuit for positive numbers only
            fork(i + 1, s + array[i], t.concat(array[i]));
        }
        fork(i + 1, s, t);
    }

    var result = [];
    fork();
    return result;
}

console.log(getSubsets([7, 2, 1, 5, 1, 20, 7], 17));
.as-console-wrapper { max-height: 100% !important; top: 0; }
 类似资料:
  • 问题内容: 给定一组整数,如何找到一个总和为给定值的子集…子集问题? 示例:S = {1,2,4,3,2,5}并且n = 7求和为n的可能子集。我试图用Google搜索出很多链接,但不清楚。我们如何在Java中解决这个问题?要使用什么数据结构及其复杂性? 问题答案: 我不会给您任何代码,但会解释它是如何工作的。 从运行循环 对于1中的每个值,其二进制表示中的1表示已选择此值,否则为0。 测试以查看

  • 当我遇到这个问题时,我正在温习动态编程。我设法用DP来确定子集和问题有多少解。 基于子集总和-恢复解决方案,我使用以下方法来检索子集,因为该集将始终被排序: 但是,由于它是一种贪婪的方法,因此它仅在每个子集的最大元素不同时才有效。如果两个子集具有相同的 max 元素,则它只返回具有较大值的子集。因此,对于总和为 10 的元素 [1, 2, 3, 4, 5],它只返回 当它应该回来的时候 我可以在w

  • 给定一组未排序的整数,返回大小为k的所有子集(即每组有k个唯一元素),其总和为0。 所以我给了面试官以下解决方案(我在GeekViewpoint上研究过)。没有使用额外的空间,一切都做到位,等等。但当然成本是O(n^k)的高时间复杂度,其中在解决方案中。 但随后她提出了以下要求: 必须在答案中使用hashmap以降低时间复杂度 必须绝对地为一般情况提供时间复杂度 k=6时的提示,O(n^3) 她对

  • 我在Scala中做了一个问题,这是任务语句的摘要: 上述示例的输出: 1 2 3 -1 第一行是数组长度,第二行是整数数组(0 以下是我尝试的:选择的元素并不重要。所以我先对给定整数的列表排序最大。然后我选择了第一个元素,检查它是否大于S,如果不大于S,我也选择了第二个元素,依此类推,直到总和大于或等于S。 我的代码(Scala):

  • 我正在练习一些动态规划问题,并试图解决用给定的和打印所有子集的问题。例如:对于和,我应该得到以下结果: 我在不使用表的情况下得到了所需的结果,我使用表来防止重复调用相同的表和求和。但是,当使用表时,我在输出中没有得到。 请帮忙!

  • 给定一组正整数和值X,找到一个其和>=X的子集S,使得sum(S)是这类已有子集所有和中的最低值。