二維費用的揹包問題

2022-06-02 13:03:13 字數 1386 閱讀 6306

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

分析:相比經典的01揹包問題,二維費用揹包問題增加了一維費用,於是我們需要在狀態上增加一維。設s[i][j][k]表示將前i件物品放入兩種容量分別為j和k的揹包時所能獲得的最大價值,則狀態轉移方程為s[i][j][k]=max,遞推邊界為當i=0時s[i][j][k]=0。和01揹包類似,狀態的維數可以輕易的從三維降低到二維,具體實現見**。

**:

1

for (int i=0; i<=v; i++)25

for (int i=1; i<=n; i++)

611 }

總結:二維費用揹包的完全揹包問題以及多重揹包問題均與01揹包類似。由二維費用揹包問題我們可以推知多維費用揹包其實就是增加狀態維數,其他型別的dp問題如果是通過原型問題增加限制條件改編而來,應該也可以通過類似的增加狀態維數來解決。

思路:動態規劃dp之二維完全揹包問題

**:

1 #include 2 #include 3 #include 

4 #include 5 #include 6 #include 7

using

namespace

std;

8#define n 110

9int dp[n][n];//

二維的

10int

a[n],b[n];

11int max(int x,int

y)12

15int

main()

1630}31

for(i=0;i<=m;i++) //

i之所以從0開始到m是由於dp[j][l]它表示 用掉了l點的忍耐度,並且殺了j個怪後,所獲得的最大經驗數

32if(dp[s][i]>=n) break; //

即用掉了m點的忍耐度,並且殺了s只怪獸後,所獲得的最大經驗數

33if(dp[s][i]//

break即跳出後還小於公升級所需經驗值時。。。

34 printf("

-1\n

"); //

即如果在殺掉s只怪獸後所得的經驗值小於還需要的經驗值的話就無法公升級輸出-1

35else

36 printf("

%d\n

",m-i); ///

/在殺了s只怪獸後,用掉了i大小的忍耐度,則還能保留的最大忍耐度是m-i37}

38return0;

39 }

view code

二維費用的揹包問題

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

二維費用的揹包問題

題目 toj3596 題意 有n張光碟,每張光碟有乙個價錢,現在要從n張光碟中買m張,預算為l,每張光碟有乙個快樂值,要求在不超過預算並且恰好買m張,使得快樂值最大。解答 典型的二維費用揹包問題,另外一種隱含的費用為個數,每個物品的個數費用為1。要求恰好買m張表示要求恰好裝滿,所以初始化不是0,而是...

二維費用的揹包問題

有 n nn 件物品和乙個容量是 v vv 的揹包,揹包能承受的最大重量是 mmm。每件物品只能用一次。體積是 v iv i vi 重量是 m im i mi 價值是 w iw i wi 求解將哪些物品裝入揹包,可使物品總體積不超過揹包容量,總重量不超過揹包可承受的最大重量,且價值總和最大。輸出最大...