根据自己的理解实现的,后来看了一下其他解法,发现有两处不同:1,其他解法是排列组合,这个仅是组合 2,这个给出了具体组合的内容。
var totalStep = 12;
var steps = [1,2,3];
var stepGroup = [];
for (var i = steps.length - 1; i >= 0; i--) {
stepGroup[i] ={key:steps[i], count: Math.floor(totalStep / steps[i])};
} console.log(stepGroup);
var count = 0;
var res = findGroup(stepGroup, totalStep, []);
console.log(res);
console.log(count);
function findGroup(stepGroup, totalStep, res){ count++; if(totalStep <=0) {
console.log('find', res);
return [res];
}
if(stepGroup.length <=0){
return [];
}
var n = 0;
var currentStep;
var currentStepCount;
var first = stepGroup[0];
currentStepCount = first.count;
currentStep = first.key;
var newRes = [];
while(n <= currentStepCount){
let cres = new Array(n);
cres.fill(currentStep, 0);
var sum = sumArr(cres);
if(sum > totalStep){
break;
}
let newCurRes = res.slice(0);
newCurRes = newCurRes.concat(cres);
newGroup = stepGroup.slice(1,stepGroup.length);
newRes = newRes.concat(findGroup(newGroup, totalStep - sum, newCurRes))
n++;
}
return newRes;
}
function sumArr(arr){
var sum = 0;
arr.forEach(function(item, i){
sum += item;
})
return sum;
}