有 n 種物品和乙個容量是 v 的揹包。
第 i 種物品最多有 si 件,每件體積是 vi,價值是 wi。
求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。
輸出最大價值。
輸入格式
第一行兩個整數,n,v,用空格隔開,分別表示物品種數和揹包容積。
接下來有 n 行,每行三個整數 vi,wi,si,用空格隔開,分別表示第 i 種物品的體積、價值和數量。
輸出格式
輸出乙個整數,表示最大價值。
資料範圍
0
1000 001000 0 2000 002000 0 ,wi, si ≤2000 00,wi ,si ≤20 00輸入樣例 1 2 3 2 4 1 3 4 3 4 5 2輸出樣例: 10^3 103時不能用n 3n^3 n3的做法需要用到多重揹包的二進位制優化方法。 如果乙個物品有s個,則分成s份,變成01揹包問題 不能直接拆,會擴大資料規模。可以用二進位制拆法 乙個有s件的物品,要把它分成s個選和不選,可以把它分成log(s)(1,2,4,8…….)份。這樣可以將資料規模的擴大降到最低。 比如19件,分成1,2,4,8,4(補)份 則取1件可以選出來 取2件可以選出來 …選19件可以選出來 可以證明這樣分可以涵蓋所有情況。4 5
n範圍在10310
#include
#include
#include
#include
using namespace std;
const
int n =
2010
;int n, m;
//n個物品,揹包容量為m
int f[n]
;int
main()
if(s >
0) goods.
push_back
(make_pair<
int,
int>
(v * s, w * s));
}for
(auto good : goods)
for(
int j = m; j >= good.first; j --
) f[j]
=max
(f[j]
, f[j - good.first]
+ good.second)
;
cout << f[m]
<< endl;
return0;
}
多重揹包問題II
多重揹包問題ii 總體積是m,每個小物品的體積是a i 每個小物品的數量是b i 每個小物品的價值是c i 求能夠放入揹包內的最大物品能夠獲得的最大價值 和上乙個很類似 上一題體積就是價值,這裡的價值是單獨定義了 狀態轉移方程 不放a i f i j f i 1 j 放a j 可放多個設為k,k m...
多重揹包問題 II
有 n 種物品和乙個容量是 v 的揹包。第 i 種物品最多有 si 件,每件體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,用空格隔開,分別表示物品種數和揹包容積。接下來有 n 行,每行三個整數 vi...
多重揹包問題 II
原題鏈結acwing5 基本思考框架 思路和多重揹包問題i一樣,但這題的資料範圍變成1000了,非優化寫法時間複雜度o n 3 接近 1e9必超時。優化多重揹包的優化 首先,我們不能用完全揹包的優化思路來優化這個問題,因為每組的物品的個數都不一樣,是不能像之前一樣推導不優化遞推關係的。詳情看下面引用...