問題描述:有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 決策 ...