揹包問題---01揹包
阿新 • • 發佈:2018-12-26
/*
* 揹包問題:
* 從M件物品中取出若干個放在容積為W的揹包中,
* 已知每件物品的體重是 w1,w2,...,wn
* 已知每件物品的價值是 p1,p2,...,pn
* 如何裝物品,實現最大價值??
*
* 型別:分為01揹包和部分揹包
* 01揹包:指揹包中的物體是不可分割的,如手機,相機,解決方案---動態規劃方案
*
* 部分揹包:指揹包中的物體可以分割,如大米,水,解決方案---貪心演算法
*
*
* */
let M = 5;
let W = 16;
let arrP = [4,5,10,11,13];
let arrW = [3,4,7,8,9];
/*
* 動態規劃揹包---求最大值:
* M --- 一共有多少件物品
* W --- 揹包的最大承載量
* arrW --- 每件物品的重量
* arrP --- 每件物品的價值
*
* 推薦看看:原理推算
* 當 沒有物品的時候
* arrP=[]
* arrW=[]
* W = 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
*
* 當 1件物品的時候
* arrP=[4] 3
* arrW=[3] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
* W = 16 0 0 0 4 4 4 4 4 4 4 4 4 4 4 4 4 4
*
*
* 當 2件物品的時候
* arrP=[4,5] 3 4 7
* arrW=[3,4] 0 0 0 4 4 4 4 4 4 4 4 4 4 4 4 4 4
* W = 16 0 0 0 4 5 5 5 9 9 9 9 9 9 9 9 9 9
*
* 當 3件物品的時候
* arrP=[4,5,10] 3 7 10
* arrW=[3,4,7] 0 0 0 4 5 5 5 9 9 9 9 9 9 9 9 9 9
* W = 16 0 0 0 4 5 5 5 9 9 9 10 15 15 15 19 19 19
* */
function plan(M, W, arrW, arrP) {
// 遍歷物品總數量---按照物品的個數依次進行動態規劃
// 存放動態規劃的結果陣列
let result = [];
for ( var i = 0; i <= M; i++ ) {
result[i] = [];
// 遍歷揹包的總承載力
for ( var j = 0; j <= W; j++ ) {
// 當揹包裡沒有物品的時候
if ( i === 0 ) {
result[i][j] = 0;
}
// 當 arrW[i - 1] > j 的時候,本次結果直接等於上一次的結果
else if ( arrW[i - 1] > j) {
result[i][j] = result[i - 1][j];
}
// 當 arrW[i - 1] < j 的時候
// 總的價值 = Math.max(本次物品的價值 + 上一次物品的價值, 上一次比較的價值)
else {
result[i][j] = Math.max(arrP[i - 1] + result[i - 1][j - arrW[i - 1]], result[i-1][j]);
}
}
}
// 最後一個就是最大值
return result[i-1][j-1];
}
console.log(plan(M, W, arrW, arrP));