演算法 揹包問題處理

2022-03-11 08:43:53 字數 2096 閱讀 1785

有乙個容量為 n 的揹包,要用這個揹包裝下物品的價值最大,這些物品有兩個屬性:體積 w 和價值 v。

定義乙個二維陣列 dp 儲存最大價值,其中dp[i][j] 表示前 i 件物品體積不超過 j 的情況下能達到的最大價值。設第 i 件物品體積為 w,價值為 v,根據第 i 件物品是否新增到揹包中,可以分兩種情況討論:

第 i 件物品可新增也可以不新增,取決於哪種情況下最大價值更大

綜上,0-1 揹包的狀態轉移方程為:

public int knapsack(int w, int n, int weights, int values)  else }}

return dp[n][w];

}

現有n件物品和乙個容量為c的揹包。第i件物品的重量是重量為w[i],價值是v[i]。已知對於一件物品必須選擇取(用1表示)或者不取(用0表示),且每件物品只能被取一次(這就是「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],那麼物品沒有放入揹包;否則物品一定被放入揹包。因此我們可以從最後一件物品開始,一步一步回退到第一件物品,直到找到所有的物品放入揹包的情況。本題中物品的裝入情況如表中紅色和藍色部分所示,其中紅色表示當前物品被裝入揹包,藍色表示沒有裝入揹包。

首先我們要說明的是,物品已經按照重量遞增、價值遞減的方式進行排序!

package com.company.backpack;

public class bp_01 ; //物品重量

int v=; //物品價值

int c=10; //揹包容量

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

x[0]=1;

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

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揹包問題)

01揹包問題 有 n 件物品和乙個容量是 v 的揹包。每件物品只能使用一次。第 i 件物品的體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,用空格隔開,分別表示物品數量和揹包容積。接下來有 n 行,...

演算法 揹包問題

揹包問題用逆序減少空間複雜度的情況下,揹包問題,如果是多維揹包 質量,容積,個數 則加矩陣維度 如果是01揹包,則逆序內迴圈,如果是完全揹包 每種物品個數不限 則順序內迴圈,如果是混合揹包 限制每種物品的個數 include using namespace std define maxn 110 d...

演算法 揹包問題

什麼是揹包問題呢?就是乙個特定載重的揹包,給你乙個資料表,求解其最優的結果,那麼很顯然嘍 這就是乙個優化問題 那麼我們具體一點!這個揹包載重8千克 李子 4kg 4500元 蘋果 5kg 5700元 士多啤梨 1kg 1100元 橘子 2kg 2250元 甜瓜 6kg 6700元 那,我們使用動態規...