<script type="text/javascript"> function fun(arr,top) { var temp = [arr]; if (arr.length < 2)return temp; arr.sort(function (a, b) {return a < b});//先倒序排列 while (arr[0] >= top) { arr[0] == top ? temp.push([arr.shift()]) : temp = [[arr.shift()]]; //筛选出所有top及超出top的元素 } var l = arr.length;//总长度 function arr_sum(t, n) { for (var a = n + 1; a < l; a++) { t.push(arr[a]);//合并下一个数组 if (eval(t.join("+")) >= top) { temp.push([].concat(t)); t.pop(); arr_sum(t,a); break; } } } for (var k = 0; k < l; k++)arr_sum([arr[k]], k);//循环组合判断 temp.sort(function (a, b) { return eval(a.join("+")) > eval(b.join("+")); });//重新排序下,前面几个才可能符合 var Arr = [temp[0]];//默认第一个 for (k = 1; k < temp.length; k++) { if (eval(temp[k].join("+")) == top)Arr.push(temp[k]);//试着判断其他 } return Arr; } console.log(fun([42.6,140.4,60.2,46.8,11.2,106.6,57,75,47.6,90.2,115.2],600)); console.log(fun([42,100,46,101,106.6,87,13,1,9,90,20,80,115.2],100)); //按理说应该可能会返回好几个符合条件的。 </script>
避免eval<script type="text/javascript"> function fun(arr,top) { var temp = [arr]; if (arr.length < 2)return temp; arr.sort(function (a, b) {return a < b});//先倒序排列 while (arr[0] >= top) { var f = arr.shift(); arr[0] == top ? temp.push([f,f]) : (temp = [[f,f]]); //筛选出所有top及超出top的元素 } var l = arr.length;//总长度 function arr_sum(t, n) { for (var a = n + 1; a < l; a++) { t.push(arr[a]);//合并下一个数组 t[0]+=arr[a];//求总和 if (t[0] >= top) { temp.push([].concat(t)); t.pop(); arr_sum(t,a); break; } } } for (var k = 0; k < l; k++)arr_sum([0,arr[k]], k);//循环组合判断 temp.sort(function (a, b) { return a[0]>b[0]; });//重新排序下,前面几个才可能符合 console.log(temp); var Arr = [temp[0].slice(1)];//默认第一个 for (k = 1; k < temp.length; k++) { if (temp[k][0] == top)Arr.push(temp[k].slice(1));//试着判断其他 } return Arr; } console.log(fun([42.6,140.4,60.2,46.8,11.2,106.6,57,75,47.6,90.2,115.2],600)); console.log(fun([42,100,46,101,106.6,87,13,1,9,90,20,80,115.2],100)); //按理说应该可能会返回好几个符合条件的。 </script>
var original_array = [42.6,140.4,60.2,46.8,11.2,106.6,57,75,47.6,90.2,115.2];
var result = [];
var condition = 600;main(original_array);console.log(result);
console.log(result[0]);function main(array){
for(var i =0; i < array.length; i++){
process(0,array.slice(i,array.length),[]);
}
result.sort(function(a,b){
return a.Total - b.Total;
});
}function process(num,array1,array2)
{
if(num >= condition){
result.push({Total:num,Array:array2});
if(array1.length > 0){
var value = array2[array2.length - 1];
num -= value;
process(num,array1,array2.slice(0,array2.length - 1));
}
}else{
if(array1.length > 0){
var value = array1[0];
num += value;
array2.push(value);
process(num,array1.slice(1,array1.length),array2);
}
}
}
document.write(result); 输出的是 [object object];
alert(result[0]) 或 alert(result[0].toString()) ; 输出的也是[object object];
document.write(result[i].Total +':'+ result[i].Array + '<br>');
609.8000000000001:60.2,46.8,11.2,106.6,57,75,47.6,90.2,115.2
635.0000000000001:140.4,60.2,46.8,11.2,106.6,57,75,47.6,90.2
660.0000000000001:140.4,60.2,46.8,11.2,106.6,57,75,47.6,115.2
677.6:42.6,140.4,60.2,46.8,11.2,106.6,57,75,47.6,90.2
702.6:42.6,140.4,60.2,46.8,11.2,106.6,57,75,47.6,115.2
function fun(arr,top) {
var temp = [arr];
if (arr.length < 2)return temp;
arr.sort(function (a, b) {return a < b});//先倒序排列
while (arr[0] >= top) {
arr[0] == top ? temp.push([arr.shift()]) : temp = [[arr.shift()]]; //筛选出所有top及超出top的元素
}
var l = arr.length;//总长度
function arr_sum(t, n) {
for (var a = n + 1; a < l; a++) {
t.push(arr[a]);//合并下一个数组
if (eval(t.join("+")) >= top) {
temp.push([].concat(t));
t.pop();
arr_sum(t,a);
break;
}
}
}
for (var k = 0; k < l; k++)arr_sum([arr[k]], k);//循环组合判断
temp.sort(function (a, b) {
return eval(a.join("+")) > eval(b.join("+"));
});//重新排序下,前面几个才可能符合
var Arr = [temp[0]];//默认第一个
for (k = 1; k < temp.length; k++) {
if (eval(temp[k].join("+")) == top)Arr.push(temp[k]);//试着判断其他
}
return Arr;
}
console.log(fun([42.6,140.4,60.2,46.8,11.2,106.6,57,75,47.6,90.2,115.2],600));
console.log(fun([42,100,46,101,106.6,87,13,1,9,90,20,80,115.2],100));
//按理说应该可能会返回好几个符合条件的。
</script>
function fun(arr,top) {
var temp = [arr];
if (arr.length < 2)return temp;
arr.sort(function (a, b) {return a < b});//先倒序排列
while (arr[0] >= top) {
var f = arr.shift();
arr[0] == top ? temp.push([f,f]) : (temp = [[f,f]]); //筛选出所有top及超出top的元素
}
var l = arr.length;//总长度
function arr_sum(t, n) {
for (var a = n + 1; a < l; a++) {
t.push(arr[a]);//合并下一个数组
t[0]+=arr[a];//求总和
if (t[0] >= top) {
temp.push([].concat(t));
t.pop();
arr_sum(t,a);
break;
}
}
}
for (var k = 0; k < l; k++)arr_sum([0,arr[k]], k);//循环组合判断
temp.sort(function (a, b) {
return a[0]>b[0];
});//重新排序下,前面几个才可能符合
console.log(temp);
var Arr = [temp[0].slice(1)];//默认第一个
for (k = 1; k < temp.length; k++) {
if (temp[k][0] == top)Arr.push(temp[k].slice(1));//试着判断其他
}
return Arr;
}
console.log(fun([42.6,140.4,60.2,46.8,11.2,106.6,57,75,47.6,90.2,115.2],600));
console.log(fun([42,100,46,101,106.6,87,13,1,9,90,20,80,115.2],100));
//按理说应该可能会返回好几个符合条件的。
</script>