我无法弄清楚如何编写一个函数来计算数组元素的所有可能总和,每次添加最多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在那里解释的:它是关于排列的。 谢谢大家,我希望这对其他人也有用。
答案 0 :(得分:3)
<强> jsFiddle Demo
强>
您可以使用置换子集递归算法来查找所有总和及其组合的集合。
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;
答案 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]