分组背包模板**分组背包问题-dp练习赛
有 N 组物品和一个容量是 V 的背包。
每组物品有若干个,同一组内的物品最多只能选一个。
每件物品的体积是 vij,价值是 wij,其中 i 是组号,j 是组内编号。
求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大。
输出最大价值。
输入格式
第一行有两个整数 N,V 用空格隔开,分别表示物品组数和背包容量。
接下来有 N 组数据:
- 每组数据第一行有一个整数 Si,表示第 ii 个物品组的物品数量;
- 每组数据接下来有 Si 行,每行有两个整数 vij,wij用空格隔开,分别表示第 i 个物品组的第 j 个物品的体积和价值;
输出格式
输出一个整数,表示最大价值。
数据范围
0<N,V≤1000<N,V≤100
0<Si≤1000<Si≤100
0<vij,wij≤1000<vij,wij≤100
输入样例
3 5 2 1 2 2 4 1 3 4 1 4 5
输出样例:
8
分组背包模板*
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 int f[10005]; 5 struct edge{int v,w;}; 6 vector<edge> G[1105]; 7 int main(){ 8 int n,m; 9 scanf("%d%d",&n,&m); 10 for(int i=1;i<=n;i++){ 11 int a;scanf("%d",&a); 12 for(int j=1;j<=a;j++){ 13 edge e;int vv,ww; 14 scanf("%d%d",&ww,&vv);e.v=vv;e.w=ww; 15 G[i].push_back(e); 16 } 17 } 18 for(int i=1;i<=n;i++) 19 for(int j=m;j>=0;j--) 20 for(int k=0;k<G[i].size();k++) 21 if(j-G[i][k].w>=0) f[j]=max(f[j],f[j-G[i][k].w]+G[i][k].v); 22 printf("%d\n",f[m]); 23 return 0; 24 }

浙公网安备 33010602011771号