問題:
如果將 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用空...