多重揹包問題ⅰ
有 n 種物品和乙個容量是 v 的揹包。
第 i 種物品最多有 si 件,每件體積是 vi,價值是 wi。
求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。
輸出最大價值。
資料範圍:
0< n , v ≤100
0< vi , wi , si ≤100
//樸素版多重揹包問題≈樸素版完全揹包問題,只不過加了物品數量的限定條件
#include
#include
using namespace std;
const int n=110;
int n,m;
int s[n],w[n],v[n];
int dp[n][n];
int main()
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>v[i]>>w[i]>>s[i];
for(int i=1;i<=n;i++)
for(int j=0;j<=m;j++)
for(int k=0;k<=s[i]&&k*v[i]<=j;k++)
dp[i][j]=max(dp[i][j],dp[i-1][j-k*v[i]]+k*w[i]);
cout<
return 0;
多重揹包問題ⅱ
資料範圍:
0< n ≤1000
0< v ≤2000
0< vi , wi , si ≤2000
最主要的思想是二進位制優化,把問題轉化為01揹包問題
int k=1;
while(k<=s)//類似於將s[i]=16,拆成一堆二進位制後1 2 4 8 1,與體積,質量乘積打包成乙份乙份
cnt++;
v[cnt]=a*k;
w[cnt]=b*k;
s-=k;
k*=2;
//如果s[i]沒用連續的二進位制打包完
if(s>0)
cnt++;
v[cnt]=a*s;
w[cnt]=b*s;
n=cnt;//這是新的物品數量
#include
#include
#include
using namespace std;
const int n=12010;
int dp[n];
int v[n],w[n];
int n,m;
int main()
cin>>n>>m;
int cnt=0;
for(int i=1;i<=n;i++)
int a,b,s;
cin>>a>>b>>s;
//對每個s[i]二進位制打包
int k=1;
while(k<=s)//類似於將s[i]=16,拆成一堆二進位制後1 2 4 8 1,與體積,質量乘積打包成乙份乙份
cnt++;
v[cnt]=a*k;
w[cnt]=b*k;
s-=k;
k*=2;
//如果s[i]沒用連續的二進位制打包完
if(s>0)
cnt++;
v[cnt]=a*s;
w[cnt]=b*s;
n=cnt;//這是新的物品數量
//因為經過上述操作後,每個物品的數量都來變成了1,於是轉變成01揹包問題,o(nvlogs)
for(int i=1;i<=n;i++)
for(int j=m;j>=v[i];j--)
dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
cout<
return 0;
多維多重揹包問題 01揹包,完全揹包,多重揹包
csdn 專業it技術社群 登入 blog.csdn.net有n件物品和乙個容量為v的揹包。第i件物品的費用是w i 價值是v i 求將哪些物品裝入揹包可使價值總和最大。1.1空間優化 這要求在每次主迴圈中我們以 v v 0 的遞減順序計算 f v 這樣才能保證計算 f v 時 f v ci 儲存的...
揹包學習 多重揹包揹包
有n種物品和乙個容量為v的揹包。第i種物品最多有n i 件可用,每件費用是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。狀態轉移方程 f i v max 此時他面臨的不是01揹包的選與不選的問題,而是從n i 裡面選多少個的問題。實現方法 1 轉化...
揹包學習 多重揹包揹包
有n種物品和乙個容量為v的揹包。第i種物品最多有n i 件可用,每件費用是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。狀態轉移方程 f i v max 此時他面臨的不是01揹包的選與不選的問題,而是從n i 裡面選多少個的問題。實現方法 1 轉化...