1. 程式人生 > >揹包問題---01揹包

揹包問題---01揹包

/* * 揹包問題: * 從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));