動態規劃之0 1揹包問題

2021-07-11 03:04:06 字數 1799 閱讀 6708

問題描述:

現有n件物品和乙個容量為c的揹包。第i件物品的重量是重量為w[i],價值是v[i]。已知對於一件物品必須選擇取(用1表示)或者不取(用0表示),且每件物品只能被取一次(這就是「0-1」的含義)。求放置哪些物品進揹包,可使這些物品的重量總和不超過揹包容量,且價值總和最大。

求解思路:

0-1揹包問題的遞推二維表

m[i][j]表示當可以放入前i件物品且揹包容量為j時的最大價值。當只能放入第一件物品即i=0時:若揹包容量j=w[0]時,物品可以放入揹包,此時m[0][j]=v[0]。當可以放入前2件物品即i=1時,我們需要進行這樣的處理:若j=w[1]時,假設此時揹包容量j=8,第二件物品可以被放入揹包內,那麼便會出現兩種情況:

(1)將第二件物品放入揹包,那麼揹包中物品的最大價值是多少呢?因為第二件物品重量為w[1]=2,在將第二件物品放入揹包之前,揹包的容量應為j-w[1]=8-2=6,此時揹包的最大價值是m[0][6],因此若將第二件物品放入揹包,其揹包的最大價值m[1][j]=m[0][j-w[1]]+v[1];

(2)不將第二件物品放入揹包,那麼此時揹包中物品的最大價值依然為只放入第一件物品時揹包的最大價值,即m[1][j]=m[0][j];

我們選取(1)(2)中價值的較大者作為i=1,j=8時揹包中的最大價值。

i=2,3,4時的分析同上,直到揹包的容量為10,此時m[4][10]即為揹包中物品的最大價值。

有了上面的分析,我們很容易寫出下面的遞迴關係:

(1)i=0  當j=w[0]時,m[0][j]=v[0]。

(2)i>0  當j=w[i],m[i][j]=max。

得到了滿足約束條件的揹包中物品的最大價值後,需要知道是哪些物品被放入了揹包。觀察二維表m[i][j],我們注意到m[i][c]表示當揹包重量為題目中要求的c時揹包的最大價值,那麼在得到m[i][c]之前,我們必然是比較了m[i-1][j-w[i]]+v[i]與m[i-1][j]的大小,從而決定是否將物品放入揹包。所以我們可以利用回溯的方法,若m[i][j]=m[i-1][j],那麼物品沒有放入揹包;否則物品一定被放入揹包。因此我們可以從最後一件物品開始,一步一步回退到第一件物品,直到找到所有的物品放入揹包的情況。本題中物品的裝入情況如表中紅色和藍色部分所示,其中紅色表示當前物品被裝入揹包,藍色表示沒有裝入揹包。

**實現:

public class main ; //物品重量

int v=; //物品價值

int c=10; //揹包容量

int x=new int[5]; //記錄物品裝入情況,0表示不轉入,1表示裝入

x[0]=1; //初始值表示第乙個物品已裝入揹包

int m=new int[5][c+1];//需要維護的二維表,為了方便計算加入一列,其中第0列表示揹包容量為0時揹包的最大價值為0

/** 初始化第一行,即揹包中裝入第一件物品

* */

for(int j=1;j<=c;j++)}/*

* 揹包中依次裝入其他的物品

* */

for(int i=1;i<5;i++)}}

system.out.println("揹包的最大價值為:"+m[w.length-1][c]);

for(int i=4;i>=1;i--)

else x[i]=0; //沒有裝入揹包

}system.out.print("裝入揹包的物品編號是:");

for(int i=0;i<5;i++)}}

動態規劃之01揹包問題

首先是問題描述 給定n種物品和一揹包,物品i的重量是wi,其價值是pi,揹包的容量是m,問如何選擇裝入揹包中的物品總價值最大?可以這樣理解 揹包的揹負有上限,因此在這個上限內盡可能多的裝東西,並且價值越多越好。在這裡我之想討論動態規劃解決這個問題的詳細過程。動態規劃是用空間換時間的一種方法的抽象。其...

動態規劃之0 1揹包問題

問題描述 0 1揹包問題是應用動態規劃設計求解的典型例題 已知n種物品和乙個可容納c重量的揹包,物品i的重量為w i 產生的效益為p i 在裝包時物品i可以裝入,也可以不裝,但不可拆開裝。問如何裝包,所得裝包總效益最大。演算法分析 最優子結構特性 0 1揹包的最優解具有最優子結構特性。與一般揹包問題...

動態規劃之01揹包問題

0 1揹包問題 一 問題描述 給定n種物品和一揹包。物品i的重量是wi,其價值為vi,揹包的容量為j。問應如何選擇裝入揹包的物品,使得裝 入揹包中物品的總價值最大?對於一種物品,要麼裝入揹包,要麼不裝。所以對於一種物品的裝入狀態可以取0和1,此問題稱為0 1揹包問題。有編號分別為a,b,c,d,e的...