【題意】
n件物品,揹包可容納重量為m的物品
每件物品有重量wi,價值vi,所屬組別gi
同個組中的物品只能拿一件
問最大價值
【題解】
正常01揹包的寫法是
for i 列舉每個物品
for j 倒序列舉揹包容量
f[j]=max(f[j], f[j-w[i]]+v[i])
在分組揹包中,同個組中的物品互斥只能拿一件。 可以把每個組看成01揹包的物品,「組」有多個重量和價值,可以從中任選一組(wi, vi) 來更新答案
那麼寫法可以改成
for i 列舉每個組
for j 倒序列舉揹包容量
for k 列舉組內的物品
f[j]=max(f[j], f[j-w[k]]+v[k])
#include#include#include#include#define n 1010using namespace std;
int n,m,k,f[n];
struct rec;
vectorobject[n];
inline int read()
int main()
for(int i=1;i<=k;i++)}}
printf("%d\n",f[m]);
return 0;
}
洛谷 P1757 通天之分組揹包
直達通天路 小a歷險記第二篇 自01揹包問世之後,小a對此深感興趣。一天,小a去遠遊,卻發現他的揹包不同於01揹包,他的物品大致可分為k組,每組中的物品相互衝突,現在,他想知道最大的利用價值是多少。輸入格式 兩個數m,n,表示一共有n件物品,總重量為m 接下來n行,每行3個數ai,bi,ci,表示物...
洛谷P1757 通天之分組揹包
直達通天路 小a歷險記第二篇 自01揹包問世之後,小a對此深感興趣。一天,小a去遠遊,卻發現他的揹包不同於01揹包,他的物品大致可分為k組,每組中的物品相互衝突,現在,他想知道最大的利用價值是多少。輸入格式 兩個數m,n,表示一共有n件物品,總重量為m 接下來n行,每行3個數ai,bi,ci,表示物...
洛谷P1757 通天之分組揹包
題目鏈結 通天之分組揹包 解題思路 典型的分組揹包問題 for 所有的組k for v v.0for 所有的i屬於組k f v max 同樣的三重迴圈,不過在輸入時需要記錄組數z 陣列t用來記錄每組有幾件物品 二維陣列s記錄每組第i件物品的的序號 附上 include using namespace...