第六講 分組的揹包問題

原文鏈接:https://www.kancloud.cn/kancloud/pack/70130

問題

有N件物品和一個容量爲V的揹包。第i件物品的費用是c[i],價值是w[i]。這些物品被劃分爲若干組,每組中的物品互相沖突,最多選一件。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。

算法

這個問題變成了每組物品有若干種策略:是選擇本組的某一件,還是一件都不選。也就是說設f[k][v]表示前k組物品花費費用v能取得的最大權值,則有:

f[k][v]=max{f[k-1][v],f[k-1][v-c[i]]+w[i]|物品i屬於組k}

使用一維數組的僞代碼如下:


 

注意這裏的三層循環的順序,甚至在本文的第一個beta版中我自己都寫錯了。“for v=V..0”這一層循環必須在“for 所有的i屬於組k”之外。這樣才能保證每一組內的物品最多隻有一個會被添加到揹包中。

另外,顯然可以對每組內的物品應用P02中“一個簡單有效的優化”。

小結

分組的揹包問題將彼此互斥的若干物品稱爲一個組,這建立了一個很好的模型。不少揹包問題的變形都可以轉化爲分組的揹包問題(例如P07),由分組的揹包問題進一步可定義“泛化物品”的概念,十分有利於解題。

首頁


Copyright (c) 2007 Tianyi Cui

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation.

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