如果不考慮附件,就是一道01揹包題。
所以我們就先不考慮附件,把它當作01揹包做一下;因爲最多隻有兩個附件,每個物品的狀態只有三種(沒,有一個,兩個),分別當作01揹包做一下,即分爲4個01揹包。然後比較四個揹包總的最大值。
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
struct po{
int data,one,two,impor,ju;
}a[61];
int n,m;int f[4][3201][61];
int main()
{
cin>>n>>m;n/=10;memset(f,0,sizeof(f));
for(int i=1;i<=m;++i)
{
a[i].one=0;
a[i].two=0;
}
for(int i=1;i<=m;++i)
{
cin>>a[i].data>>a[i].impor>>a[i].ju;
a[i].data/=10;
if(a[i].ju!=0)
{
if(a[a[i].ju].one==0)
a[a[i].ju].one=i;
else a[a[i].ju].two=i;
a[i].ju=-1;
}
}
for(int j=1;j<=m;++j)
{
for(int i=n;i>=1;--i)
{
f[0][i][j]=f[0][i][j-1];
if(i<a[j].data||a[j].ju!=0) continue;
f[0][i][j]=max(f[0][i][j],f[0][i-a[j].data][j-1]+a[j].data*a[j].impor);
}
}
for(int j=1;j<=m;++j)
{
for(int i=n;i>=1;--i)
{
f[1][i][j]=f[1][i][j-1];
if(i<a[j].data||a[j].ju!=0) continue;
f[1][i][j]=max(f[1][i][j],f[1][i-a[j].data][j-1]+a[j].data*a[j].impor);
if(i>=a[j].data+a[a[j].one].data)
f[1][i][j]=max(f[1][i][j],f[1][i-a[j].data-a[a[j].one].data][j-1]+a[j].data*a[j].impor+a[a[j].one].data*a[a[j].one].impor);
}
}
for(int j=1;j<=m;++j)
{
for(int i=n;i>=1;--i)
{
f[2][i][j]=f[2][i][j-1];
if(i<a[j].data||a[j].ju!=0) continue;
f[2][i][j]=max(f[2][i][j],f[2][i-a[j].data][j-1]+a[j].data*a[j].impor);
if(i>=a[j].data+a[a[j].two].data)
f[2][i][j]=max(f[2][i][j],f[2][i-a[j].data-a[a[j].two].data][j-1]+a[j].data*a[j].impor+a[a[j].two].data*a[a[j].two].impor);
}
}
for(int j=1;j<=m;++j)
{
for(int i=n;i>=1;--i)
{
f[3][i][j]=f[3][i][j-1];
if(i<a[j].data||a[j].ju!=0) continue;
f[3][i][j]=max(f[3][i][j],f[3][i-a[j].data][j-1]+a[j].data*a[j].impor);
if(i>=a[j].data+a[a[j].two].data+a[a[j].one].data)
f[3][i][j]=max(f[3][i][j],f[3][i-a[j].data-a[a[j].two].data-a[a[j].one].data][j-1]+a[j].data*a[j].impor+a[a[j].two].data*a[a[j].two].impor+a[a[j].one].data*a[a[j].one].impor);
}
}
int k1=max(f[0][n][m],f[1][n][m]);
int k2=max(f[2][n][m],f[3][n][m]);
cout<<max(k1,k2)*10;
return 0;
}