通俗理解0 1揹包問題解法

2021-07-24 18:01:13 字數 2190 閱讀 9773

0-1揹包問題是乙個很經典的問題,使用動態規劃演算法來求解也是很經典的。下面我用乙個例子來講解用動態規劃演算法求解0-1揹包問題。

假設商店中有5件東西,重量用w表示,**用v表示

現在有乙個小偷來到了小店中,這哥們帶了乙個袋子,但是這個袋子只能裝20公斤(w=20)的東西,問題來了,他怎麼樣偷才能拿到總價值最高呢?這就是乙個0-1揹包問題。

現在給5件商品編號

先來看看乙個遞推公式:

直接使用遞迴的方法:

package knapsack;

public

class knapsack ;//商品的重量

public

double v = new

double;//商品的價值

public

double

b(int k,int knapsack)

}public

static

void

main(string args)

}

下面是乙個**(直接生成的表

怎麼看呢?

第一行全是0代表:沒有商品可以偷全是0

第一豎全是0代表:揹包容量為0什麼也偷不了

座標代表當揹包容量為w的時候去偷前k件商品可以獲得的最大價值

例如:上圖黃色圈數字9代表:揹包容量為7時去偷前3件商品可以獲得的最大價值為9

上圖黃色圈數字11代表:揹包容量為7時去偷前5件商品可以獲得的最大價值為11

所以可以填表的方式進行動態規劃來算:

1.揹包容量為20,先初始化**(**是乙個二維陣列table[6][6]):第一行第一豎都是0

一行一行把**填完:

a.首先計算黃色圈的處的值,此處代表揹包容量為1時去偷前1件商品的最大價值:

b.然後計算紅色圈處的值,此處代表揹包容量為2時去偷前1件商品的最大價值:

利用上面的遞推公式,因為第一件商品重量為2,所以當揹包容量為2時可以偷第一件,所以用遞推公式的第2條b(k-1,w-wk) + vk = b(0,0)+3 = 3 和第三條b(k-1,w) =b(0,2)=0 ,所以最終的值為3

c. 然後計算白色圈處的值,此處代表揹包容量為3時去偷前1件商品的最大價值:

利用上面的遞推公式,因為第一件商品重量為2,所以當揹包容量為3時可以偷第一件,所以用遞推公式的第2條b(k-1,w-wk) + vk = b(0,1)+3 = 3 和第三條b(k-1,w) =b(0,3)=0 ,所以最終的值為3

就這樣一行一行把**填完。。。。。

01揹包問題解法及優化

給定乙個容量為c的揹包,重量為weight,價值為value的石頭,求揹包能容納的最大價值。例 weight 1 2,3 value 6 10,12 c 5輸出 22 揹包中放入乙個重量為3的石頭和乙個重量為2的石頭 value 10 12 22.public intfindres int weig...

01揹包問題 C 解法

01揹包問題 假設現有容量m的揹包,有i個物品,重量分別為w 1 w 2 w i 價值分別為p 1 p 2 p i 將哪些物品放入揹包可以使得揹包的總價值最大?最大價值是多少?示例1 m 10,i 3,物品重量 價值 3 4 4 5 5 6 第一種 不帶備忘的自頂向下法 using system n...

分組揹包問題解法

前面的部落格中提到了0 1揹包問題,下面說明一種更加複雜的動態規劃問題 分組揹包。乙個容量為v的揹包 和有n 0,1,2 i n 件物品。第i件物品的費用是c i 價值是w i 這些物品被劃分為若干組,每組中的物品互相衝突,最多選一件。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價...