分组背包+二维费用背包

题目: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 }

猜你喜欢

转载自www.cnblogs.com/greenofyu/p/11707182.html
今日推荐