Javascript,数组成员的所有可能总和(最多4个)

时间:2014-12-19 00:05:06

标签: javascript algorithm

我无法弄清楚如何编写一个函数来计算数组元素的所有可能总和,每次添加最多4个元素。

鉴于

x = [1, 32, 921, 9213, 97, 23, 97, 81, 965, 82, 965, 823]

我需要从(1+32) ~ (965+823)转到(1+32+921+9213) ~ (965+82+965+823),计算所有可能的金额。

输出应该是这样的数组:

{33:[1,32],922:[1,921],...... 2835:[965,82,965,823]}

以所有可能的金额填补。

这不是作业,我在寻找的是Travis J在那里解释的:它是关于排列的。 谢谢大家,我希望这对其他人也有用。

2 个答案:

答案 0 :(得分:3)

<强> jsFiddle Demo

您可以使用置换子集递归算法来查找所有总和及其组合的集合。

&#13;
&#13;
var x = [1, 32, 921, 9213, 97, 23, 97, 81, 965, 82, 965, 823];
var sums = [];
var sets = [];
function SubSets(read, queued){
 if( read.length == 4 || (read.length <= 4 && queued.length == 0) ){
  if( read.length > 0 ){
   var total = read.reduce(function(a,b){return a+b;},0);
   if(sums.indexOf(total)==-1){
    sums.push(total);
    sets.push(read.slice().sort());
   }
  }
 }else{
  SubSets(read.concat(queued[0]),queued.slice(1));
  SubSets(read,queued.slice(1));
 }
}
SubSets([],x);
console.log(sums.sort(function(a,b){return a-b;}));
//log sums without sort to have them line up to sets or modify previous structure
console.log(sets);
&#13;
&#13;
&#13;

答案 1 :(得分:0)

此处有一个函数可以生成 n k 成员组合:https://gist.github.com/axelpale/3118596

我不会在这里重现这个功能。您可以将它与另一个函数组合以对从输入数组生成的组合求和,例如

// Add combinations of k members of set
function getComboSums(set, k) {
  return k_combinations(arr, n).map(function(a){
    var sum=0;
    a.forEach(function(v){sum += v})
    return sum;
  });
}

这可以与另一个函数结合使用,以获得从2到4的所有组合,并将它们连接在一起。请注意,一组12个成员中的组合总数为781。

// Add all combinations from kStart to kEnd of set
function getComboSumRange(set, kStart, kEnd) {
  var result = [];
  for (var i=kStart; i <= kEnd; i++) {
    result = result.concat(getComboSums(set, i));
  }
  return result;
}

然后给出:

var arr = [1, 32, 921, 9213, 97, 23, 97, 81, 965, 82, 965, 823];

console.log(getComboSumRange(arr, 2, 4)) // length is 781

781的长度与根据在n中找到k组合的公式计算的术语数一致:

n! / (k!(n - k)!)

和k = 2的总和 - &gt; 4。

结果如下:

[33, 922, 9214, 98, 24, 98 ...  2834, 1951, 2835];

您可以看到以下字词开头:

arr[0] + arr[1], arr[0] + arr[2]], ...

并以:

结束
... arr[7] + arr[9] + arr[10] + arr[11], arr[8] + arr[9] + arr[10] + arr[11]