题目:https://www.acwing.com/problem/
分组背包问题描述是共有n组物品,每组物品你只能选一个,求最大价值
1 #include<iostream>
2 #include<cstring>
3 #include<algorithm>
4 using namespace std;
5 const int N=110;
6 struct node
7 {
8 int v,w;
9 };
10 node wp[N];
11 int n,m;
12 int f[N];
13 int main(void)
14 {
15 cin>>n>>m;
16 for(int i=1;i<=n;i++)
17 {
18 int s;
19 cin>>s;
20 for(int j=1;j<=s;j++)
21 {
22 cin>>wp[j].v>>wp[j].w;
23 }
24 for(int j=m;j>=0;j--)//枚举体积,先枚举体积才能保证同组物品不可能被选多次,至于枚举方法应该是同01背包的,因为只有一个
25 {
26 for(int k=1;k<=s;k++)//枚举每个物品
27 {
28 if(j-wp[k].v>=0)
29 {
30 f[j]=max(f[j],f[j-wp[k].v]+wp[k].w);
31 }
32 }
33 }
34 }
35 cout<<f[m];
36 return 0;
37 }
知识兔二位费用背包也是个比较简单的问题,主要就是将01背包中的体积换为重量和体积两个参数
1 #include<iostream>
2 #include<cstring>
3 #include<algorithm>
4 using namespace std;
5 const int N=110;
6 int n,V,M;
7 int f[N][N];
8 int main(void)
9 {
10 cin>>n>>V>>M;
11 for(int i=1;i<=n;i++)
12 {
13 int v,m,w;
14 cin>>v>>m>>w;
15 for(int j=V;j>=v;j--)
16 {
17 for(int k=M;k>=m;k--)
18 {
19 if(j-v>=0&&k-m>=0)
20 {
21 f[j][k]=max(f[j][k],f[j-v][k-m]+w);
22 }
23 }
24 }
25 }
26 cout<<f[V][M];
27 return 0;
28 }
知识兔