javascript - 来自预定义集合的组合总和与目标值

标签 javascript algorithm

我有以下代码。我需要该数组中的所有数字组合,其总和是目标 100000。问题是下面的解决方案不包含以下对 20000 40000 40000 。这是因为对于每次递归,我都会取出数字(查看 filter 功能)。如果我没有 filter ,则会发生超出最大调用堆栈的情况。

所以最后的任务是让和为目标的所有数字组合,每个组合应该只有3个数字,0也参与。

知道如何解决吗?

function subsetSum(numbers, target, partial) {
  var s, n, remaining;

  partial = partial || [];

  // sum partial
  s = partial.reduce(function(a, b) {
    return a + b;
  }, 0);

  // check if the partial sum is equals to target
  if (s === target && partial.length === 3) {
    console.log("%s=%s", partial.join("+"), target)
  }

  if (s >= target) {
    return; // if we reach the number why bother to continue
  }

  for (var i = 0; i < numbers.length; i++) {
    n = numbers[i];
    remaining = numbers.filter(num => num != n);
    subsetSum(remaining, target, partial.concat([n]));
  }
}

subsetSum([0, 10000, 20000, 30000, 40000, 50000, 60000, 70000, 80000, 90000], 100000);

最佳答案

你是对的,因为你过滤掉了选择的数字,你不能得到下面的输出

2000 4000 4000

当你把过滤掉的时候,你会得到一个堆栈溢出,因为你没有在partial时停止递归。长度为 3。因此递归调用将 0 添加到 partial永远不会停止递归...因为它们永远不会导致超过目标。

因此将其添加到“基本案例”中:

function subsetSum(numbers, target, partial) {
  var s, n, remaining;

  partial = partial || [];

  // sum partial
  s = partial.reduce(function(a, b) {
    return a + b;
  }, 0);

  // check if the partial sum is equals to target
  if (s === target && partial.length === 3) {
    console.log("%s=%s", partial.join("+"), target)
  }

  if (s >= target || partial.length === 3) {
    return; // if we reach the number or maximum length don't bother to continue
  }

  for (var i = 0; i < numbers.length; i++) {
    n = numbers[i];
    subsetSum(numbers, target, partial.concat([n]));
  }
}

subsetSum([0, 10000, 20000, 30000, 40000, 50000, 60000, 70000, 80000, 90000], 100000);

关于javascript - 来自预定义集合的组合总和与目标值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67038050/

相关文章:

javascript - jquery多维数组 - 一个父数组和三个子数组

javascript - ng-repeat 中的动态 ng-model 名称

javascript - Cordova - ios - 在 map 应用程序中打开 - 未打开 - 'maps://?q='

algorithm - 如何以编程方式执行此等式

c++ - 删除二叉搜索树中的节点

javascript - html5 显示音频当前时间

java - 单击按钮时如何调用servlet

java - 快速排序Java中的无限循环

python - 找到两对总和为相同值的对

javascript - 在 Javascript 中查找两个数组的交集