JavaScript - 子集和算法的特例

时间:2016-01-14 09:46:45

标签: javascript algorithm recursion subset-sum

从给定的正整数数组中,我想知道数组中E元素的总和是否等于给定的数字N.

例如,给定数组arr = [1,2,3,4],e = 3且n = 9.这意味着如果arr中3个元素的总和等于9.结果为真,因为2 + 3 + 4等于9。

另一个例子是arr = [1,2,3,4],e = 2和n = 7.这是正确的,因为3 + 4等于7.

我试图通过递归来解决它,但我被卡住了。我的想法是动态地嵌套循环以将元素遍历到数组并进行比较。

我的尝试是这样的:

function subsetsum(arr, elements, n) {
    loop(arr, elements, n, [], 0);
}

function loop(arr, elements, n, aux, index) {
    if(aux.length != elements) {
        aux[index] = arr.length - 1;
        loop(arr, elements, n, aux, index + 1);
    } else {
        if ((elements - index + 1) < 0) {
            return 0;
        } else {
            if (aux[elements - index + 1] > 0) { 
                aux[elements - index + 1]--;
                loop(arr, elements, n, aux, index); 
            }
        }
    }
}

subsetsum([1, 2, 3, 4], 3, 9));

3 个答案:

答案 0 :(得分:1)

相关问题发生在Find the highest subset of an integer array whose sums add up to a given target。可以修改它以限制子集中元素的数量,如下所示:

// Find subset of a, of length e, that sums to n
function subset_sum(a, e, n) {
  if (n < 0)   return null;           // Nothing adds up to a negative number
  if (e === 0) return n === 0 ? [] : null; // Empty list is the solution for a target of 0

  a = a.slice();
  while (a.length) {              // Try remaining values
    var v = a.shift();            // Take next value
    var s = subset_sum(a, e - 1, n - v); // Find solution recursively
    if (s) return s.concat(v);    // If solution, return
  }
}

答案 1 :(得分:0)

我已经玩了一段时间并决定使用快捷方式,主要是来自this previous SO question的排列代码。

我的代码使用基本上使用置换代码从输入数组创建一个包含所有可能排列的数组,然后为每个数组(使用map)抓取对应于指定为{{1}的数字的切片},对该切片求和,如果它与amount相同则返回total

true然后返回最终结果,以确定是否存在等于总数的排列。

some

我已经包含了两个演示 - 1)演示this code的演示,2)提供a more detailed breakdown的代码:基本上function checker(arr, amount, total) { var add = function (a, b) { return a + b; } return permutator(arr).map(function(arr) { var ns = arr.slice(0, amount); var sum = ns.reduce(add); return sum === total; }).some(Boolean); } checker([1, 2, 3, 4], 3, 9); // true 返回包含切片信息的对象,总和以及是否满足条件。

这可能不是你要找的东西,因为它有点啰嗦,但对我来说调查肯定是有用的。)

编辑 - 或者这里是上一个问题的排列代码的黑客版本,它提供了结果和一系列匹配:

map

DEMO

答案 2 :(得分:-2)

如果我理解正确,这项任务的解决方案必须简单:

function subsetsum(arr, countElements, sum) {
  var length = arr.length-1;
  var temp = 0;
  var lastElement = length-countElements; 
  console.log(lastElement);
  for (var i = length; i > lastElement; i--) {
    temp = temp+arr[i];
    console.log('Sum: '+temp);
  }
  if (temp === sum) {
    console.log('True!');
  } else {console.log('False!')}
};
subsetsum([1, 2, 3, 4], 2, 7);