題目:有 n 種物品和乙個容量是 v 的揹包。物品一共有三類:
第一類物品只能用1次(01揹包);
第二類物品可以用無限次(完全揹包);
第三類物品最多只能用 si 次(多重揹包);
每種體積是 vi,價值是 wi。
求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。
輸出最大價值。
輸入格式
第一行兩個整數,n,v,用空格隔開,分別表示物品種數和揹包容積。接下來有 n 行,每行三個整數 vi,wi,si,用空格隔開,分別表示第 i 種物品的體積、價值和數量。
si=−1 表示第 i 種物品只能用1次;
si=0 表示第 i 種物品可以用無限次;
si>0 表示第 i 種物品可以使用 si 次;
輸出格式
輸出乙個整數,表示最大價值。
資料範圍
0解析:在讀入物品資料時進行分類,將三類揹包問題分成01揹包與完全揹包,其中只需要把多重揹包按二進位制優化思想分成01揹包即可。
code:
#include
#include
#include
using
namespace std;
const
int n =
1010
;int f[n]
;struct thing
;vector things;
intmain()
);else
if(s ==
0) things.
push_back()
;else);
}if(s >
0) things.
push_back()
;}}for
(auto thing : things)
}else}}
cout<;return0;
}
揹包九講 之 混合揹包思路題解
問題重述 有 n 種物品和乙個容量是 v 的揹包。物品一共有三類 第一類物品只能用1次 01揹包 第二類物品可以用無限次 完全揹包 第三類物品最多只能用 si 次 多重揹包 每種體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。輸出最大價值。輸入格式...
揹包九講專題 混合揹包
不優化樸素解法,01揹包看出s 1,完全揹包看成s inf,再跑多重揹包 時間複雜度高,3層for迴圈 includeusing namespace std const int maxn 1e3 5 int dp maxn intv maxn w maxn s maxn intmain for in...
揹包九講之 01揹包
01揹包是最基礎的揹包問題,其中01代表的就是第i個物品的選或不選,在此先設v i 為體積,w i 為價值。很顯然,我們可以使用二位陣列dp i j 來表示前i個物品在揹包容量為j的時候可存放的最大價值。首先dp 0 0 0是很顯然的。而計算dp i j 時,存在01兩種情況 選或不選第i件物品。1...