例題 混合揹包

2021-09-11 07:10:12 字數 1219 閱讀 5346

problem description

乙個旅行者有乙個最多能用v公斤的揹包,現在有n件物品,它們的重量分別是w1,w2,...,wn,它們的價值分別為c1,c2,...,cn。有的物品只可以取一次(01揹包),有的物品可以取無限次(完全揹包),有的物品可以取的次數有乙個上限(多重揹包)。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。

input

輸入有多組資料,對於輸入每組資料的第一行:二個整數,v(揹包容量,v<=200),n(物品數量,n<=30);

第2..n+1行:每行三個整數wi,ci,pi,前兩個整數分別表示每個物品的重量,價值,第三個整數若為0,則說明此物品可以購買無數件,若為其他數字,則為此物品可購買的最多件數(pi)。

output

對於每組輸入輸出僅一行,乙個數,表示最大總價值。

sample input

10 3

2 1 0

3 3 1

4 5 4

sample output

11hint

選第一件物品1件和第三件物品2件。 

解題思路:在學習多重揹包時,我們有接觸過將其轉化為0/1揹包求解,這樣做的好處是既可以降低時間,又可以將未知轉化為已知,便於書寫**。轉化過之後,就只剩下完全揹包與0/1揹包兩種型別了,那麼根據二者差異性可以得知,0/1揹包是逆序,而完全揹包是順序,於是我們可以在當 i 是完全揹包是順序遍歷,否則逆序遍歷。

**示例:

#include#include#includeusing namespace std;

const int maxn = 1e3;

int limited[maxn];

int w[maxn],val[maxn];

int f[maxn];

int cnt,v,n;

void init()

void solve()else

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

}int main()else

if(c)}}

solve();

} return 0;

}

混合揹包 分組揹包

啥是混合揹包呢,就是包含01揹包,完全揹包,多重揹包。有n件物品,揹包承重最大為m,w i 代表重量,v i 代表價值,s i 代表種類。s i 1,可用1次,s i 0,可用無限次,s i 0,可用s i 次.解法 見 const int maxn 1e4 5 int n,m,dp m 1 w n...

揹包問題例題

p1060 開心的金明 題目鏈結 思路 0 1揹包問題 0 1揹包問題的模板,dp陣列用二維也可以都是一樣的道理,一維是壓縮了空間 for i 1.n 物品從1到n分別決定選或者不選 for j ba 0 揹包從最大體積到0 if j w i 可以裝的下 dp j max dp j dp j w i...

混合揹包問題

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