混合三種揹包問題

2021-10-03 05:56:07 字數 1655 閱讀 2727

問題:

如果將 01揹包問題、完全揹包問題、多重揹包問題混合起來。也就是說,有的物品只可以取一次(01揹包),有的物品可以取無限次(完全揹包),有的物品可以取的次數有乙個上限(多重揹包)。應該怎麼求解呢?

考慮到在 01揹包問題 和 完全揹包問題 中給出的偽**只有一處不同,故如果只有兩類物品:一類物品只能取一次,另一類物品可以取無限次,那麼只需在對每個物品應用轉移方程時,根據物品的類別選用順序或逆序的迴圈即可,複雜度是o(vn)。偽**如下:

for i=1..n

if 第i件物品是01揹包

for v=v..0

f[v]=max;

else if 第i件物品是完全揹包

for v=0..v

f[v]=max;

例題:旅行者有乙個容量為v公斤的揹包

n :物品種數

w :物品重量

v :物品價值

p :0表示可取無窮多件,1表示可取一件

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

輸入樣例:

10 3

2 1 0

3 3 1

4 5 0

輸出樣例:

11

#include#includeusing namespace std;

int v,n;

int w[31],v[31],p[31];

int f[201];

int max(int x,int y)

}printf("%d",f[v]);

return 0;

}

如果再加上有的物品最多可以取有限次,那麼可以用 多重揹包問題中 將每個這類物品分成當然,更清晰的寫法是呼叫我們前面給出的三個相關過程。

for i=1..n

if 第i件物品是01揹包

zeroonepack(c[i],w[i]) //呼叫01揹包問題函式

else if 第i件物品是完全揹包

completepack(c[i],w[i]) //呼叫完全揹包問題函式

else if 第i件物品是多重揹包

multiplepack(c[i],w[i],n[i]) //呼叫多重揹包問題函式

例題:旅行者有乙個容量為v公斤的揹包

n :物品種數

w :物品重量

v :物品價值

p :物品可以拿取的數目(0表示可取無窮多件)

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

輸入樣例:

10 3

2 1 0

3 3 1

4 5 4

輸出樣例:

11

#include#includeusing namespace std;

int v,n;

int w[31],v[31],p[31];

int f[201];

int max(int x,int y)

}printf("%d",f[v]);

return 0;

}

混合三種揹包問題

問題 如果將01揹包 完全揹包 多重揹包混合起來。也就是說,有的物品只可以取一次 01揹包 有的物品可以取無限次 完全揹包 有的物品可以取的次數有乙個上限 多重揹包 應該怎麼求解呢?01揹包與完全揹包的混合 考慮到在01揹包和完全揹包中最後給出的偽 只有一處不同,故如果只有兩類物品 一類物品只能取一...

混合三種揹包問題

問題 如果將01揹包 完全揹包 多重揹包混合起來。也就是說,有的物品只可以取一次 01揹包 有的物品可以取無限次 完全揹包 有的物品可以取的次數有乙個上限 多重揹包 應該怎麼求解呢?01揹包與完全揹包的混合 考慮到在01揹包和完全揹包中最後給出的偽 只有一處不同,故如果只有兩類物品 一類物品只能取一...

混合揹包問題(三種揹包問題的總結)

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