經歷過拼多多的筆試題,就知道該多學學動態規劃演算法了。。
問題描述:
有n和重量和價值分別為wi,vi的物品,從這些物品中挑選出總質量不超過c的物品,如何挑選使得總價值量最大?
思路分析:序號
weight
value12
3456
78910
a250
5588
1313
141616b
3301
3889
1111
1414c5
6011
8899
91414d
4801
1889
9999
e210
1111
1111
1這個**是自底向上從左到右的順序,e2單元格表示最多容重2時,只有e物品可選時,最大價值為1
c3表示最多容重為3時,只有c.d.e物品可選時,最大價值為1,因為d和e都大於3,裝不了。
a8的值是14,怎麼得到?
根據01揹包的狀態轉換方程: f[i,j] = max
f[i-1][j]表示b[8]的值為11,f[i-1],j-wi]表示b6的值為9,9+5=14>11,因此a8的值為14。
當揹包容量為j時,已經放入了i件物品,最大價值為d[i]d[j]
當第i件物品比揹包容量還大時,不能放,所以,d[i][j]=d[[i-1][j];
當第i件物品比揹包容量小時,就要判斷兩種情況:不放的話,和上式相同,放的話,揹包容量-第i件物品的質量再去裝前i-1件物品,所得得最大價值加上第i件物品的價值,兩者較大值即為最優解。d[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i])
#include #include #include #include #include using namespace std;
#define empty
#define inf -65536
const int c=10;//容量capability
int n;//物品個數
int w[15],v[15];//物品個數,物品質量weight,物品價值value
int dp[1000][c+1]=;
int main()
}cout<從空間花費從大到小來構成for迴圈的話,就可以直接用一維陣列來儲存物品數-1 的值。
當揹包容量為j時,已經放入了i件物品,最大價值為d[j]
當第i件物品比揹包容量還大時,d[j]=d[j];
當第i件物品比揹包容量小時,就要判斷兩種情況:不放的話,和上式相同,放的話,揹包容量-第i件物品的質量再去裝前i-1件物品,所得得最大價值加上第i件物品的價值,兩者較大值即為最優解。d[j]=max(dp[j],dp[j-w[i]]+v[i])
#include #include #include #include #include using namespace std;
#define empty
#define inf -65536
const int c=10;//容量capability
int n;//物品個數
int w[15],v[15];//物品個數,物品質量weight,物品價值value
int dp[c+1];
int main()
}cout
}
0 1揹包問題(一維陣列解法)
0 1揹包問題 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。這個問題的特點是 每種物品只有一件,可以選擇放或者不放。演算法基本思想 利用動態規劃思想 子問題為 f i v 表示前i件物品恰放入乙個...
板子 0 1揹包問題 一維陣列
有 n 件物品和乙個容量是 v 的揹包。每件物品只能使用一次。第 i 件物品的體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出最大價值。第一行兩個整數,n,v,用空格隔開,分別表示物品數量和揹包容積。接下來有 n 行,每行兩個整數 vi,wi...
0 1揹包使用一維陣列
使用滾動陣列將空間優化到了2 v,在揹包九講中提到了使用一維陣列也可以達到同樣的效果,個人認為這也是滾動思想的一種,由於使用一維陣列解01揹包會被多次用到,完全揹包的一種優化實現方式也是使用一維陣列,所以我們有必要理解這種方法。如果只使用一維陣列f 0 v 我們要達到的效果是 第i次迴圈結束後f v...