多重揹包問題 I

2021-10-06 16:11:28 字數 1438 閱讀 7099

有 n 種物品和乙個容量是 v 的揹包。

第 i 種物品最多有 si 件,每件體積是 vi,價值是 wi。

求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。

輸出最大價值。

輸入格式

第一行兩個整數,n,v,用空格隔開,分別表示物品種數和揹包容積。

接下來有 n 行,每行三個整數 vi,wi,si,用空格隔開,分別表示第 i 種物品的體積、價值和數量。

輸出格式

輸出乙個整數,表示最大價值。

資料範圍

0輸入樣例:

451

2324

1343

452

輸出樣例:

10
題目鏈結

這道題與01揹包差不多,還是原汁原味的方程。

f[i,j]代表的是從前i個物品選,並且總體積小於等於j的方程。

不過與01揹包不一樣的是第i個物品可以選si個。

那我們怎麼進行狀態計算呢,就是以第i個物品選多少個來劃分。

我們就需要列舉所有可能選的情況就可以了。

狀態轉移方程:

f[i,j]

=max

(f[i,j]

,f[i-

1,j-k*v[i]

]+k*w[i]

);

**如下:

#include

#include

using

namespace std;

const

int n =

100+10;

int v[n]

,w[n]

,s[n]

;int f[n]

[n];

int n,m;

using

namespace std;

intmain()

}}cout << f[n]

[m]<< endl;

return0;

}

既然用到了f[i-1]層的資料,那麼我們就可以類似的,跟01揹包一樣的優化。將二維陣列優化為一維。只需要將體積逆向列舉就可以。

**如下:

#include

#include

#include

using

namespace std;

const

int maxn =

110;

int s[maxn]

,v[maxn]

,w[maxn]

;int f[maxn]

;int n,m;

intmain()

}}cout << f[m]

;return0;

}

多重揹包問題 I

有 n 種物品和乙個容量是 v 的揹包。第 i 種物品最多有 si 件,每件體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,用空格隔開,分別表示物品種數和揹包容積。接下來有 n 行,每行三個整數 vi...

多重揹包問題I

有 n 種物品和乙個容量是 v 的揹包。第 i 種物品最多有 si 件,每件體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,用空格隔開,分別表示物品種數和揹包容積。接下來有 n 行,每行三個整數 vi...

4 多重揹包問題 I

有 nn 種物品和乙個容量是 vv 的揹包。第 ii 種物品最多有 sisi 件,每件體積是 vivi,價值是 wiwi。求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。輸出最大價值。第一行兩個整數,n,vn,v,用空格隔開,分別表示物品種數和揹包容積。接下來有 nn 行,每...