其实也是一个01背包问题 只不过在更新背包的过程中多了三种选择
1 :不选主件
2 :选主件,不选附件
3 :选主件 ,选附件1
4 :选主件 ,选附件2
5 :选主件 ,选附件1和2
#include <bits/stdc++.h>
using namespace std;
int n,m;
int v_[3][100],w_[3][100]; //用来存附件的数据
int v[100],w[100]; //用来存主件的数据
int dp[320000];
int main()
{
int a,b,c;
cin>>n>>m; //总钱数和物品数
for(int i=1;i<=m;i++)
{
cin>>a>>b>>c;
if(!c)w[i]=a,v[i]=b*a; //主件就直接存
else
{
v_[0][c]++;//存有多少附件
w_[v_[0][c]][c]=a;
v_[v_[0][c]][c]=b*a;
}
}
for(int i=1;i<=m;i++)
{
int k=v_[0][i];
for(int j=n;j>=w[i]&&w[i]!=0;j-=10)
{
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
if(!k)continue;
if(j>=(w[i]+w_[1][i]))dp[j]=max(dp[j],dp[j-w[i]-w_[1][i]]+v[i]+v_[1][i]);
if(k==2)
{
if(j>=(w[i]+w_[2][i]))
dp[j]=max(dp[j],dp[j-w[i]-w_[2][i]]+v[i]+v_[2][i]);
if(j>=(w[i]+w_[1][i]+w_[2][i]))
dp[j]=max(dp[j],dp[j-w[i]-w_[1][i]-w_[2][i]]+v[i]+v_[1][i]+v_[2][i]);
}
}
}
cout<<dp[n]<<endl;
}