二維費用揹包問題(揹包九講)

2021-06-22 03:43:58 字數 1165 閱讀 6180

------------------------------------------

前言:對於一些揹包問題,重點還是在於如何找出「揹包容量」和「各種代價」,以及價值,如此問題便迎刃而解了。下午 打籃球居然下冰雹了,悲催了。。。。

------------------------------------------

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

演算法:

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

f[i][v][u]=max。如前述方法,可以只使用二維的陣列:當每件物品只可以取一次時變數v和u採用逆序的迴圈,當物品有如完全揹包問題時採用順序的迴圈。當物品有如多重揹包問題時拆分物品。這裡就不再給出偽**了,相信有了前面的基礎,你能夠自己實現出這個問題的程式。

物品總個數的限制:

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

複數域上的揹包問題:

另一種看待二維揹包問題的思路是:將它看待成複數域上的揹包問題。也就是說,揹包的容量以及每件物品的費用都是乙個復 數。而常見的一維揹包問題則是實數域上的揹包問題。(注意:上面的話其實不嚴謹,因為事實上我們處理的都只是整數而已。)所以說,一維揹包的種種思想方法,往往可以應用於二位揹包問題的求解中,因為只是數域擴大了而已。作為這種思想的練習,你可以嘗試將p11中提到的「子集和問題」擴充套件到複數域(即二維),並試圖用同樣的複雜度解決

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

-----------------------------------------

總結:

揹包九講之二維費用的揹包問題

有 n 件物品和乙個容量是 v 的揹包,揹包能承受的最大重量是 m。每件物品只能用一次。體積是 vi,重量是 mi,價值是 wi。求解將哪些物品裝入揹包,可使物品總體積不超過揹包容量,總重量不超過揹包可承受的最大重量,且價值總和最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,m,用空格隔開,分...

揹包九講之五(二維費用的揹包問題)

1 2 二維費用的揹包問題是指 對於每件物品,具有兩種不同的費用,3選擇這件物品就必須付出這兩種代價,每種代價都有可付出的最大值 揹包容量 4問怎麼選擇物品才能得到最大價值.費用增加了一維,那麼只需要狀態增加一維就可以了 5dp i j k 前i件物品付出兩種代價為j和k的最大價值 6dp i j ...

揹包九講之二維成本揹包

多重揹包的理解請建立在01揹包與完全揹包的基礎上,在了解01揹包與完全揹包後,多重揹包即可不攻自破。01揹包 完全揹包 多重揹包 混合揹包 二維成本即一種物品需要支付兩種成本,前四講中,所有物品僅有乙個重量成本,放在容量為v的揹包當中,而在二維成本揹包中,則多了乙個約束。具體描述 有n種物品,其中第...