混合揹包詳解

混合揹包

有的物品只可以取一次(01揹包),有的物品可以取無限次(完全揹包),有的物品可以取的次數有一個上限(多重揹包)。應該怎麼求解呢?

01揹包與完全揹包的混合
考慮到在P01和P02中給出的僞代碼只有一處不同,故如果只有兩類物品:一類物品只能取一次,另一類物品可以取無限次,那麼只需在對每個物品應用轉移方程時,根據物品的類別選用順序或逆序的循環即可,複雜度是O(VN)。僞代碼如下:

for i=1…N
if 第i件物品屬於01揹包
for v=V…0
f[v]=max{f[v],f[v-c[i]]+w[i]};
else if 第i件物品屬於完全揹包
for v=0…V
f[v]=max{f[v],f[v-c[i]]+w[i]};
再加上多重揹包
如果再加上有的物品最多可以取有限次,那麼原則上也可以給出O(VN)的解法:遇到多重揹包類型的物品用單調隊列解即可。但如果不考慮超過NOIP範圍的算法的話,用P03中將每個這類物品分成O(log n[i])個01揹包的物品的方法也已經很優了。

當然,更清晰的寫法是調用我們前面給出的三個相關過程。

for i=1…N
if 第i件物品屬於01揹包
ZeroOnePack(c[i],w[i])
else if 第i件物品屬於完全揹包
CompletePack(c[i],w[i])
else if 第i件物品屬於多重揹包
MultiplePack(c[i],w[i],n[i])

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章