分组背包模板**分组背包问题-dp练习赛

有 N 组物品和一个容量是 V 的背包。

每组物品有若干个,同一组内的物品最多只能选一个。
每件物品的体积是 vij,价值是 wij,其中 i 是组号,j 是组内编号。

求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大。

输出最大价值。

输入格式

第一行有两个整数 N用空格隔开,分别表示物品组数和背包容量。

接下来有 N 组数据:

  • 每组数据第一行有一个整数 Si,表示第 ii 个物品组的物品数量;
  • 每组数据接下来有 Si 行,每行有两个整数 vij,wij用空格隔开,分别表示第 i 个物品组的第 j 个物品的体积和价值;

输出格式

输出一个整数,表示最大价值。

数据范围

0<N,V1000<N,V≤100
0<Si1000<Si≤100
0<vij,wij1000<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 }
View Code

 




posted @ 2020-10-27 14:38  莳曳  阅读(159)  评论(0)    收藏  举报