当前位置: 首页 > news >正文

有依赖的背包 【模板】

测试链接
测试链接2

思路

其实有依赖的背包可以看成一个状况更复杂的01背包问题,01背包只需要考虑装和不装,有依赖的背包,如这个模板,就是考虑装主件,还是不装主件,装主件的话要装几个附件,因此,实际看代码可以发现就是多加了几个if条件分支,仅此而已

题解

#include <bits/stdc++.h>
using namespace std;
const int N=1e2+10;
typedef long long ll;
struct node
{int v,w,q;int f1=-1,f2=-1;
}a[N];
int n,m,ans;
int dp[35005];
int main()
{cin>>n>>m;for(int i=1;i<=m;i++){cin>>a[i].v>>a[i].w>>a[i].q;if(a[i].q!=0){if(a[a[i].q].f1>0){a[a[i].q].f2 = i;}else a[a[i].q].f1 = i;}}for(int i=1;i<=m;i++){for(int j=n;j>=1;j--){if(a[i].q>0)continue;else{int t = dp[j];int f1 = a[i].f1;int f2 = a[i].f2;if(j>=a[i].v)t=max(t,dp[j-a[i].v]+a[i].v*a[i].w);if(f1>0&&j>=a[i].v+a[f1].v)t = max(t,dp[j-a[i].v-a[f1].v]+a[i].w*a[i].v+a[f1].v*a[f1].w);if(f2>0&&j>=a[i].v+a[f2].v)t = max(t,dp[j-a[i].v-a[f2].v]+a[i].v*a[i].w+a[f2].w*a[f2].v);if(f1>0&&f2>0&&j>=a[i].v+a[f1].v+a[f2].v)t = max(t,dp[j-a[i].v-a[f1].v-a[f2].v]+a[i].w*a[i].v+a[f1].v*a[f1].w+a[f2].v*a[f2].w);dp[j]=t;}}}cout<<dp[n]<<endl;return 0;
}

不用结构体版本

#include <bits/stdc++.h>
using namespace std;
const int N = 5e4;
int n,m;
int dp[N],w[N],v[N],ff[N];
int fans[N][2];
int main()
{cin>>n>>m;memset(fans,-1,sizeof(fans));for(int i=1;i<=m;i++){int a,b,c;cin>>a>>b>>c;w[i]=a;v[i]=b*a;ff[i]=c;if(c==0)continue;else if(fans[c][0]==-1)fans[c][0]=i;else fans[c][1]=i;     }for(int i=1;i<=m;i++){if(ff[i]!=0)continue;for(int j=n;j>=0;j--){if(j>=w[i])dp[j]=max(dp[j-w[i]]+v[i],dp[j]);if(fans[i][0]!=-1&&j>=w[i]+w[fans[i][0]])dp[j]=max(dp[j-w[i]-w[fans[i][0]]]+v[i]+v[fans[i][0]],dp[j]);if(fans[i][1]!=-1&&j>=w[i]+w[fans[i][1]])dp[j]=max(dp[j-w[i]-w[fans[i][1]]]+v[i]+v[fans[i][1]],dp[j]);if(fans[i][0]!=-1&&fans[i][1]!=-1&&j>=w[i]+w[fans[i][0]]+w[fans[i][1]])dp[j]=max(dp[j-w[i]-w[fans[i][0]]-w[fans[i][1]]]+v[i]+v[fans[i][0]]+v[fans[i][1]],dp[j]);}}cout<<dp[n]<<endl;return 0;
}
http://www.sczhlp.com/news/3983/

相关文章:

  • 第二十二日
  • P6561 题解
  • 一步一步学习使用LiveBindings(5) 使用TAdapterBindSource实现对象绑定
  • 一元二次方程大全
  • 输入框功能测试用例检查点
  • 2025暑 7-8
  • P9497 「RiOI-2」weight——二分
  • P3514 [POI 2011] LIZ-Lollipop 解题报告
  • CF1762F 题解
  • 深入解析:推客小程序商业模型设计:合规分佣体系盈利模式LTV提升策略
  • 天坑树链剖分
  • 4. 逻辑运算
  • C++提高编程 - Ref
  • FastAPI后台任务:是时候让你的代码飞起来了吗?
  • 递归(三角形实例代码)
  • C++基础入门 - Ref
  • 这里有MingGW64的下载链接,免费不要密码
  • 注册功能测试用例检查点
  • 社交媒体上的隐蔽通信:利用Python实现C2通道
  • kotlin: 接口的例子
  • kotlin: Job() 工厂方法作为父协程
  • kotlin: Job的生命周期
  • kotlin: cancel()和cancelAndJoin()
  • kotlin: flow: 用launchIn指flow运行的线程
  • kotlin: flow: 用flowon指定上游的线程池
  • kotlin:flow: 用try/catch捕捉下游的异常
  • 小记
  • 摆烂日志
  • MQTT-mosquitto
  • React Flow 隐藏水印