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);//比較下現(xiàn)在的情況是不是比不動要好 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 真的很容易理解震嫉,成倍出現(xiàn),
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);
})
多重背包
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來显押,“玉大人扳肛,你說我怎么就攤上這事〕吮” “怎么了挖息?”我有些...
- 文/不壞的土叔 我叫張陵,是天一觀的道長兽肤。 經(jīng)常有香客問我套腹,道長绪抛,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任电禀,我火速辦了婚禮幢码,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鞭呕。我一直安慰自己蛤育,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開白布葫松。 她就那樣靜靜地躺著瓦糕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪腋么。 梳的紋絲不亂的頭發(fā)上咕娄,一...
- 文/蒼蘭香墨 我猛地睜開眼扛稽,長吁一口氣:“原來是場噩夢啊……” “哼吁峻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起在张,我...
- 序言:老撾萬榮一對情侶失蹤用含,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后帮匾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體啄骇,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年瘟斜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缸夹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
- 正文 年R本政府宣布,位于F島的核電站佣蓉,受9級特大地震影響披摄,放射性物質(zhì)發(fā)生泄漏亲雪。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一疚膊、第九天 我趴在偏房一處隱蔽的房頂上張望义辕。 院中可真熱鬧,春花似錦寓盗、人聲如沸灌砖。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽基显。三九已至,卻和暖如春善炫,著一層夾襖步出監(jiān)牢的瞬間撩幽,已是汗流浹背。 一陣腳步聲響...
- 正文 我出身青樓艺谆,卻偏偏與公主長得像榨惰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子静汤,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- 我在進(jìn)行一些互聯(lián)網(wǎng)公司的技術(shù)筆試的時(shí)候排监,對于我來說最大的難題莫過于最后的那幾道編程題了狰右,這對算法和數(shù)據(jù)結(jié)構(gòu)有一定程...
- 本文翻譯自TopCoder上的一篇文章: Dynamic Programming: From novice to ...
- 題目 有N種物品和一個(gè)容量為V的背包挨队。第i種物品最多有n[i]件可用谷暮,每件費(fèi)用是c[i],價(jià)值是w[i]盛垦。求解將哪...
- 上一篇講的完全背包是指在所有物品件數(shù)無限多的情況下選擇最值湿弦,現(xiàn)在引申出多重背包問題,即各物品個(gè)數(shù)w[ i ]均有限...