混合三種揹包問題

2021-09-20 18:59:50 字數 1728 閱讀 2547

問題

如果將01揹包、完全揹包、多重揹包混合起來。也就是說,有的物品只可以取一次(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;

再加上多重揹包

如果再加上有的物品最多可以取有限次,那麼原則上也可以給出o(vn)的解法:遇到多重揹包型別的物品用單調佇列解即可。但如果不考慮超過noip範圍的演算法的話,用多重揹包中將每個這類物品分成o(log n[i])個01揹包的物品的方法也已經很優了。

cin>>x>>y>>s;         

while (s>=t)

weight[++n1]=x*s;

value[n1]=y*s; //把s以2的指數分堆:1,2,4,…,2^(k-1),s-2^k+1,

小結

有人說,困難的題目都是由簡單的題目疊加而來的。這句話是否公理暫且存之不論,但它在本講中已經得到了充分的體現。本來01揹包、完全揹包、多重揹包都不是什麼難題,但將它們簡單地組合起來以後就得到了這樣一道一定能嚇倒不少人的題目。但只要基礎紮實,領會三種基本揹包問題的思想,就可以做到把困難的題目拆分成簡單的題目來解決

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

n :物品種數

w :物品重量

c :物品價值

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

輸入樣例:

10 3

2 1 0

3 3 1

4 5 4

輸出樣例:

#include#includeusing namespace std;

int m,n;

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

int f[201];

int max(int x,int y)

w[++n1]=x*s;

c[n1]=y*s;

p[n1]=1;

}else

}for(int i=1; i<=n1; i++)

else //01揹包

}for(int i=1; i<=m; i++)

printf("%d\n",f[i]);

printf("%d",f[m]);

return 0;

}

#include#includeusing namespace std;

int m,n;

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

int f[201];

int max(int x,int y)

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

return 0;

}

混合三種揹包問題

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

混合三種揹包問題

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

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

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