分组背包+二维费用背包

题目: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 }
复制代码

 

posted on   greenofyu  阅读(224)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示