問題重述
有 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揹包統一起來,最後我們在處理01和完全兩種揹包就行了。
c++**:
#include
#include
using
namespace std;
struct thing
;int n,v;
intmain()
);}else
if(counts>0)
//counts大於0說明為多重揹包 );
//拆解後變為01揹包但價值和體積與物品數量有關要重新構建 }if
(counts>0)
);}}
}for
(auto thing : things)
//重構後的物品就都變成了01揹包和完全揹包我們遍歷物品分別處理
}else
//否則說明是完全揹包則體積從小到大遍歷 }}
cout<;//輸出最終答案
return0;
}
揹包九講專題 混合揹包
不優化樸素解法,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...
動態規劃之揹包九講之四 混合揹包
題目 有 n 種物品和乙個容量是 v 的揹包。物品一共有三類 第一類物品只能用1次 01揹包 第二類物品可以用無限次 完全揹包 第三類物品最多只能用 si 次 多重揹包 每種體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。輸出最大價值。輸入格式 第...
揹包九講之 01揹包
01揹包是最基礎的揹包問題,其中01代表的就是第i個物品的選或不選,在此先設v i 為體積,w i 為價值。很顯然,我們可以使用二位陣列dp i j 來表示前i個物品在揹包容量為j的時候可存放的最大價值。首先dp 0 0 0是很顯然的。而計算dp i j 時,存在01兩種情況 選或不選第i件物品。1...