1. 程式人生 > >動態規劃-0-1揹包

動態規劃-0-1揹包

0-1揹包,動態規劃解決方案

三個物品, 考慮揹包能夠攜帶的重量只有5 。對於這個例子,我們可以說最佳解決方案是往揹包裡裝入

物品1 和物品2 ,這樣,總重量為5 ,總價值為7 。

 

 

 

function knapSack(capacity, weights, values, n) {
  var i, w, a, b, kS = [];
  for (i = 0; i <= n; i++) { //{1}首先,初始化將用於尋找解決方案的矩陣ks[n+1][capacity+1]
    kS[i] = [];
  }
  
for (i = 0; i <= n; i++) { for (w = 0; w <= capacity; w++) { if (i == 0 || w == 0) { //{2}忽略矩陣的第一列和第一行,只處理索引不為0的列和行 kS[i][w] = 0; } else if (weights[i - 1] <= w) { //{3}物品i的重量必須小於約束(capacity)才有可能成為解決方案的一部分;否則, //總重量就會超出揹包能夠攜帶的重量,這是不可能發生的。發生這種情況時,只要忽略
//它,用之前的值就可以了(行{5})。 a = values[i - 1] + kS[i - 1][w - weights[i - 1]]; b = kS[i - 1][w]; kS[i][w] = (a > b) ? a : b; //{4} max(a,b) 當找到可以構成解決方案的物品時,選擇價值最大的那個 } else { kS[i][w] = kS[i - 1][w]; //{5} 最後,問題的解決方案就在這個二維表格右下角的最後一個格子裡
} } } findValues(n, capacity, kS, weights, values); return kS[n][capacity]; //{6} } function findValues(n, capacity, kS, weights, values) { var i = n, k = capacity; console.log('解決方案包含以下物品:'); while (i > 0 && k > 0) { if (kS[i][k] !== kS[i - 1][k]) { console.log('物品' + i + ',重量:' + weights[i - 1] + ',價值:' + values[i - 1]); i--; k = k - kS[i][k]; } else { i--; } } } var values = [3, 4, 5], weights = [2, 3, 4], capacity = 5, n = values.length; console.log(knapSack(capacity, weights, values, n)); //輸出 7