我有阵列[1,2,4],我想制作4;我希望它返回[4],而不是[[1,1,1,1],[1,1,2],[2,2],[4]],我以前这样做但我开始跑在小型服务器上运行时内存不足。我不得不让整个函数运行,所以我可以.reverse(),因为数组中的最后一次只对我有用。
如果我们从货币的角度考虑这个问题,那么我们采取[0.5,0.5,1,0.2];如果我想要1美元,我想要[1]而不是[0.5,0.5],因为你总是想要每个项目的最大价值吗?
我目前正在使用这个:
function getCombinations(array, sum) {
function fork(i, t) {
var s = t.reduce(function (a, b) { return a + b; }, 0);
if (sum === s) {
result.push(t);
return;
}
if (s > sum || i === array.length) {
return;
}
fork(i + 1, t.concat([array[i]]));
fork(i + 1, t);
}
var result = [];
fork(0, []);
return result;
}
console.log(getCombinations([1, 2, 4], 4));

.as-console-wrapper { max-height: 100% !important; top: 0; }

但是这并没有倒退,所以我让它向后迭代:
function getCombinations(array, sum) {
function fork(i, t) {
var s = t.reduce(function (a, b) { return a + b; }, 0);
if (sum === s) {
result.push(t);
return;
}
if (s > sum || i === 0) {
return;
}
fork(i - 1, t.concat([array[i]]));
fork(i - 1, t);
}
var result = [];
fork(array.length, []);
return result;
}
console.log(getCombinations([1, 2, 4], 4));

.as-console-wrapper { max-height: 100% !important; top: 0; }

但这并不适用于我使用的大型操作,例如我试图这样做:
警告:这可能会破坏您的浏览器
function getCombinations(array, sum) {
function fork(i, t) {
var s = t.reduce(function (a, b) { return a + b; }, 0);
if (sum === s) {
result.push(t);
return;
}
if (s > sum || i === 0) {
return;
}
fork(i - 1, t.concat([array[i]]));
fork(i - 1, t);
}
var result = [];
fork(array.length, []);
return result;
}
var Items = [];
for(var j = 0; j < 7; j++) Items.push(0.11);
for(var k = 0; k < 197; k++) Items.push(1);
console.log(getCombinations(Items, 26.77));
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;