二維費用揹包

問題

二維費用的揹包問題是指:對於每件物品,具有兩種不同的費用;選擇這件物品必須同時付出這兩種代價;對於每種代價都有 一個可付出的最大值(揹包容量)。問怎樣選擇物品可以得到最大的價值。設這兩種代價分別爲代價1和代價2,第i件物品所需的兩種代價分別爲a[i]和 b[i]。兩種代價可付出的最大值(兩種揹包容量)分別爲V和U。物品的價值爲w[i]。

算法

費用加了一維,只需狀態也加一維即可。設f[i][v][u]表示前i件物品付出兩種代價分別爲v和u時可獲得的最大價值。狀態轉移方程就是:

f[i][v][u]=max{f[i-1][v][u],f[i-1][v-a[i]][u-b[i]]+w[i]}

如前述方法,可以只使用二維的數組:當每件物品只可以取一次時變量v和u採用逆序的循環,當物品有如完全揹包問題時採用順序的循環。當物品有如多重揹包問題時拆分物品。這裏就不再給出僞代碼了,相信有了前面的基礎,你能夠自己實現出這個問題的程序。

物品總個數的限制

有時,“二維費用”的條件是以這樣一種隱含的方式給出的:最多隻能取M件物品。這事實上相當於每件物品多了一種“件數 ”的費用,每個物品的件數費用均爲1,可以付出的最大件數費用爲M。換句話說,設f[v][m]表示付出費用v、最多選m件時可得到的最大價值,則根據物 品的類型(01、完全、多重)用不同的方法循環更新,最後在f[0..V][0..M]範圍內尋找答案。

複數域上的揹包問題

另一種看待二維揹包問題的思路是:將它看待成複數域上的揹包問題。也就是說,揹包的容量以及每件物品的費用都是一個復 數。而常見的一維揹包問題則是實數域上的揹包問題。(注意:上面的話其實不嚴謹,因爲事實上我們處理的都只是整數而已。)所以說,一維揹包的種種思想方法,往往可以應用於二位揹包問題的求解中,因爲只是數域擴大了而已。

作爲這種思想的練習,你可以嘗試將P11中提到的“子集和問題”擴展到複數域(即二維),並試圖用同樣的複雜度解決。

小結

當發現由熟悉的動態規劃題目變形得來的題目時,在原來的狀態中加一緯以滿足新的限制是一種比較通用的方法。希望你能從本講中初步體會到這種方法。

發佈了4 篇原創文章 · 獲贊 22 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章