題目描述:
有 n 種物品和乙個容量是 v的揹包。
物品一共有三類:
每種體積是 vi,價值是 wi。
求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。
輸出最大價值。
輸入格式
第一行兩個整數,n,v,用空格隔開,分別表示物品種數和揹包容積。
接下來有 n行,每行三個整數 vi,wi,si,用空格隔開,分別表示第 i種物品的體積、價值和數量。
分析:本題是01揹包,完全揹包以及多重揹包的混合題,每讀入乙個物品的屬性,是什麼揹包就按照哪個揹包的狀態轉移方程去轉移狀態即可。即s = 0時,完全揹包:f[i][j] = max(f[i-1][j],f[i][j-v]+w);s = -1時,01揹包:f[i][j] = max(f[i-1][j],f[i-1][j-v]+w),s > 0時,多重揹包,f[i][j] = max(f[i-1][j-kv]+kw),j >= kv且k <= s。鑑於多重揹包的樸素版本比較耗時間,本題就採用多重揹包問題的二進位制優化,具體分析見acwing 5 多重揹包問題 ii,由於01揹包相當於s = 1的多重揹包問題,所以可以歸入多重揹包的求解。
下面簡單講解下二進位制優化多重揹包問題,第i個物品有s件,將其分為若干組,每組含該物品1,2,4,8,...r個,r表示剩餘的件數,比如s = 9,則可以劃分為1,2,4,2四組,然後相當於求解體積分別為v,2v,4v,2v的四個物品的01揹包問題。
#include #include using namespace std;
const int n = 1005;
int f[n];
int main()
else
if(s)}}
printf("%d\n",f[m]);
return 0;
}
ACWing 7 混合揹包問題
有n nn種物品和乙個容量是v vv的揹包。物品一共有三類 第一類物品只能用1 11次 0 1 0 10 1揹包 第二類物品可以用無限次 完全揹包 第三類物品最多只能用s is i si 次 多重揹包 每種體積是v iv i vi 價值是w iw i wi 求解將哪些物品裝入揹包,可使物品體積總和不...
Acwing 混合揹包
有 n 種物品和乙個容量是 v 的揹包。物品一共有三類 第一類物品只能用1次 01揹包 第二類物品可以用無限次 完全揹包 第三類物品最多只能用 si 次 多重揹包 每種體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。輸出最大價值。輸入格式 第一行兩...
混合揹包問題
如果將p01 p02 p03混合起來。也就是說,有的物品只可以取一次 01揹包 有的物品可以取無限次 完全揹包 有的物品可以取的次數有乙個上限 多重揹包 應該怎麼求解呢?考慮到在p01和p02中給出的偽 只有一處不同,故如果只有兩類物品 一類物品只能取一次,另一類物品可以取無限次,那麼只需在對每個物...