揹包問題詳解

2021-08-27 02:57:13 字數 1586 閱讀 3411

問題描述:有n件物品和乙個容量為v的揹包。第i件物品的重量是w[i],價值是p[i]。求解將哪些物品裝入揹包可使這些物品的總重量不超過揹包容量,且價值總和最大。

思路:每種物品僅有一件,可以選擇放或不放。

f[i,v]表示前i件物品放入乙個容量為v的揹包可以獲得的最大價值。狀態轉移方程為:

f[i,v]=max

將前i件物品放入容量為v的揹包中,如果只考慮第i件物品的策略(放或者不放),那麼就可以轉化為乙個只和前i-1件物品相關的問題。

問題:有編號分別為a,b,c,d,e的五件物品,它們的重量分別是2,2,6,5,4,它們的價值分別是6,3,5,4,6,每件物品數量只有乙個,現在給你個承重為10的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?

思路1:建立二維陣列 dp。id

weight

price01

2345

6789

10a26

0066

6666

666b

2300

6699

9999

9c65

0066

9999

111114d

5400

6699

910111314e

4600

6699

1212

1515

15

public class 揹包問題 else

for(int i=1;ij)else

}} return dp[w.length-1][v];

} public static void main(string args);

int p=;

int max=maxprice(v, w, p);

system.out.println(max);

}}

思路2:把二維陣列變為一維陣列。

問題描述:有編號分別為a,b,c,d的四件物品,它們的重量分別是2,3,4,7,它們的價值分別是1,3,5,9,每件物品數量無限個,現在給你個承重為10的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?

思路:完全揹包問題和01揹包問題的區別在於每一件物品的數量都有無限個,而01揹包每件物品數量只有乙個。初始化時,當只考慮一件物品a時,f[1][j]=j/w[a]。遞推公式計算時,f[i][y]=max,注意這裡當考慮放入乙個物品i時應當考慮還可能繼續放入i,因此是f[i][y]=max,而不是f[i][y]=max。

public class 完全揹包問題 else

for(int j=1;ji)else

}}

for(int i=0;isystem.out.println();

} return dp[w.length-1][v]; }

public static void main(string args);

int p=;

int res=maxprice(v, w, p);

system.out.println(res);

}}

揹包問題詳解

nyoj289蘋果 01揹包 時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 ctest有n個蘋果,要將它放入容量為v的揹包。給出第i個蘋果的大小和價錢,求出能放入揹包的蘋果的總價錢最大值。輸入 有多組測試資料,每組測試資料第一行為2個正整數,分別代表蘋果的個數n和揹包的容量...

揹包問題系列詳解

揹包問題是乙個關於最優解的經典問題。通常被討論的最多的,最經典的揹包問題是0 1揹包問題 0 1 knapsack problem 它是一切揹包問題及相關揹包問題的基礎。本篇博文將詳細分析0 1揹包問題,並給出0 1揹包問題的幾種解法,同時也對0 1揹包問題的內涵進行延伸,豐富其外延至完全揹包問題和...

01揹包問題詳解

01揹包問題簡單描述 有乙個揹包和n個物品,揹包的承載量為c,每件物品重量為w i 價值為v i 問如何裝才能使揹包中物品的總價值最大?解題方法 f i,j 在前i個物品中選擇若干件放在承重為j的揹包中,可以取得的最大的價值。f i,j max f i 1,j w i v i f i 1,j 決策 ...