function PackageItem (name, weight, value, count){
this.name = name;
this.weight = weight;
this.value = value;
this.count = count;
}
function get01PackageAnswer(bagItems , bagsize) {
var bagMatrix = [];
var i ;
var item;
for (i = 0; i < bagItems.length; i++) {
bagMatrix[i] = [0];
}
for (i = 1; i <= bagsize;i++) {
for (var j = 0; j < bagItems.length; j++) {
item = bagItems[j];
if (item.weight > i)
{
if (j==0) {
bagMatrix[j][i] = 0;
} else {
bagMatrix[j][i] = bagMatrix[j-1][i];
}
}
else
{
var itemInBag;
if (j == 0) {
bagMatrix[j][i] = item.value;
continue ;
} else {
itemInBag = bagMatrix[j-1][i-item.weight] + item.value; //向上向下找都无所谓,只要安一定的顺序找就行了
}
bagMatrix[j][i] = (bagMatrix[j-1][i] > itemInBag ? bagMatrix[j-1][i] : itemInBag);//比较下现在的情况是不是比不动要好 0+6 < 7 就不动
}
}
}
var answers = [];
var curSize = bagsize;
for ( i = bagItems.length - 1; i >= 0; i--) {
item = bagItems[i];
if (curSize == 0)
break;
if (i == 0 && curSize > 0) {
answers.push(item.name);
break;
}
if (bagMatrix[i][curSize] - bagMatrix[i-1][curSize - item.weight] == item.value) {
answers.push(item);
curSize -= item.weight;
}
}
return answers;
}
/** split result 真的很容易理解,成倍出现,
a:1
b:1
b:1
c:1
c:2
d:1
d:2
d:1
e:1
e:2
e:2
*/
function split(items) {
var splitedItems = [];
for (var i = 0; i < items.length; i++) {
for (var j = 1; j <= items[i].count; j = j * 2) {
let item = new PackageItem(items[i].name,items[i].weight * j,items[i].value * j, j);
splitedItems.push(item);
items[i].count -= j;
}
if (items[i].count > 0) {
let item = new PackageItem(items[i].name,items[i].weight * items[i].count,items[i].value * items[i].count, items[i].count);
splitedItems.push(item);
}
}
return splitedItems;
}
var nameArr = ['a','b','c','d','e'];
var weightArr = [3,2,6,5,4];
var valueArr = [6,3,13,4,6];
var countArr = [1,2,3,4,5]
var bagItems = [];
for (var i = 0; i < nameArr.length; i++) {
var bagItem = new PackageItem(nameArr[i],weightArr[i],valueArr[i],countArr[i]);
bagItems[i] = bagItem;
}
var splitedItems = split(bagItems);
var arr = get01PackageAnswer(splitedItems,23);
arr.forEach(function(item,index,array) {
console.log(item.name + ":" + item.count);
})
多重背包
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 我在进行一些互联网公司的技术笔试的时候,对于我来说最大的难题莫过于最后的那几道编程题了,这对算法和数据结构有一定程...
- 本文翻译自TopCoder上的一篇文章: Dynamic Programming: From novice to ...
- 题目 有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪...