[轉(zhuǎn)]背包問題九講v1.0(P05:二維費用的背包問題)

問題

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

算法

費用加了一維,只需狀態(tài)也加一維即可。設(shè)f[i][v][u]表示前i件物品付出兩種代價分別為vu時可獲得的最大價值。狀態(tài)轉(zhuǎn)移方程就是:

f[i][v][u]=max{f[i-1][v][u],f[i-1][v-a[i]][u-b[i]]+w[i]}```
如前述方法,可以只使用二維的數(shù)組:當(dāng)每件物品只可以取一次時變量```v```和```u```采用逆序的循環(huán),當(dāng)物品有如完全背包問題時采用順序的循環(huán)。當(dāng)物品有如多重背包問題時拆分物品。這里就不再給出偽代碼了,相信有了前面的基礎(chǔ),你能夠自己實現(xiàn)出這個問題的程序。
#####物品總個數(shù)的限制
有時,“二維費用”的條件是以這樣一種隱含的方式給出的:最多只能取M件物品。這事實上相當(dāng)于每件物品多了一種“件數(shù)”的費用,每個物品的件數(shù)費用均為1,可以付出的最大件數(shù)費用為M。換句話說,設(shè)f[v][m]表示付出費用v、最多選m件時可得到的最大價值,則根據(jù)物品的類型(01、完全、多重)用不同的方法循環(huán)更新,最后在f[0..V][0..M]范圍內(nèi)尋找答案。
####小結(jié)
是不是可以用來解決多重背包的問題???只不過比多重背包復(fù)雜度高
當(dāng)發(fā)現(xiàn)由熟悉的動態(tài)規(guī)劃題目變形得來的題目時,在原來的狀態(tài)中加一維以滿足新的限制是一種比較通用的方法。希望你能從本講中初步體會到這種方法。
####轉(zhuǎn)載:dd_engi 的背包九講
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容