有一组数,数字大小和个数不固定。比如:
12,15,16,15,9,15,29,35,19,49,25,25
要求:
每组数字和必须大于等于68
分尽可能多的组
分组剩余的数字和尽可能的大
用什么样的算法呢,若有代码就更好了,谢谢!!
背包算法的变形,因为你算的是最小和而不是最大和
http://blog.csdn.net/lan_liang/article/details/41313117
我要能分尽可能多的包,并且最后剩余的最大,背包算法只有一个包
////背包算法练习--求大于某数字的数组最小和:
var bestS = {
val: 10000,
str: ""
};
var LIMIT;
Array.prototype.sum = function() {
var s = 0;
for (var i = 0; i < this.length; i++) {
s += this[i];
}
return s;
}
function f(bagArr) {
var arrS = bagArr.sum();
if (arrS > LIMIT) {
bestS = arrS < bestS.val ? {
val: arrS,
str: bagArr.join(',')
}: bestS;
/// return;
}
for (var i = 0; i < bagArr.length; i++) {
var copyArr = new Array();
for (var j = 0; j < bagArr.length; j++) {
copyArr.push(bagArr[j]);
}
copyArr.splice(i, 1);
f(copyArr);
}
}
LIMIT = 197;
f(new Array(49, 28, 119, 50, 78, 48, 29, 49, 52));
console.log(bestS);
////背包算法练习--求大于某数字的数组最小和:
var bestS = {
val: 10000,
str: ""
};
var LIMIT;
Array.prototype.sum = function() {
var s = 0;
for (var i = 0; i < this.length; i++) {
s += this[i];
}
return s;
}
function f(bagArr) {
var arrS = bagArr.sum();
if (arrS > LIMIT) {
bestS = arrS < bestS.val ? {
val: arrS,
str: bagArr.join(',')
}: bestS;
/// return;
}
for (var i = 0; i < bagArr.length; i++) {
var copyArr = new Array();
for (var j = 0; j < bagArr.length; j++) {
copyArr.push(bagArr[j]);
}
copyArr.splice(i, 1);
f(copyArr);
}
}
LIMIT = 197;
f(new Array(49, 28, 119, 50, 78, 48, 29, 49, 52));
console.log(bestS);
这样的话,执行时间也太长了,数字稍微大点,就要运行几分钟,可以优化不??
当数据增加一倍,就好像死了一样,几分钟都不好,你的算法不太好!
我是不是悬赏少了???
求高手
求高手
求高手
求高手
求高手
求高手
求高手
求高手
求高手
求高手
求高手
求高手