输入:
输出:
样例:
一道有依赖性的01背包问题,分为五种情况,
1.不选主件
2.只选主件
3.选主件和附件1
4.选主件和附件2
5.选主件和附件1和附件2
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
int av[N],aw[N],bw[N][3],bv[N][3],dp[N];
int main()
{
ios::sync_with_stdio(false);
int n,m;
cin>>n>>m;
int v,p,q;
for(int i=1;i<=m;i++){
cin>>v>>p>>q;
if(q==0){
av[i]=v;
aw[i]=v*p;
}
else{
bv[q][0]++;
bv[q][bv[q][0]]=v;
bw[q][bv[q][0]]=v*p;
}
}
for(int i=1;i<=m;i++){
for(int j=n;j>=av[i];j--){
dp[j]=max(dp[j],dp[j-av[i]]+aw[i]);
if(j>=av[i]+bv[i][1])
dp[j]=max(dp[j],dp[j-av[i]-bv[i][1]]+aw[i]+bw[i][1]);
if(j>=av[i]+bv[i][2])
dp[j]=max(dp[j],dp[j-av[i]-bv[i][2]]+aw[i]+bw[i][2]);
if(j>=av[i]+bv[i][1]+bv[i][2])
dp[j]=max(dp[j],dp[j-av[i]-bv[i][1]-bv[i][2]]+aw[i]+bw[i][1]+bw[i][2]);
}
}
cout<<dp[n]<<endl;
return 0;
}