题解
加长版的01背包,只需要对主件处理:
如果没有附件:1.只取主件
如果有一个附件:1.只取主件 2.取主件和附件
如果有两个附件:1.只取主件 2.取主件和附件1 3.取主件和附件2 4.取主件和两个附件
然后就好做了。
#include<bits/stdc++.h>
using namespace std;
struct imf
{
int price,importance,whe;
int belong[65];
} a[65];
int book[65];
int n,m;
int dp[32005];
int main()
{
// freopen("budget.in","r",stdin);
// freopen("budget.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1; i<=m; i++)
{
scanf("%d%d%d",&a[i].price,&a[i].importance,&a[i].whe);
if(a[i].whe!=0)
{
a[a[i].whe].belong[0]++;
a[a[i].whe].belong[a[a[i].whe].belong[0]]=i;
}
}
for(int i=1; i<=m; i++)
{
for(int j=n; j>=0; j--)
{
if(a[i].whe == 0)
{
if(a[i].belong[0]==0)
{
if(j>=a[i].price)
dp[j]=max(dp[j],dp[j-a[i].price]+a[i].price*a[i].importance);
}
if(a[i].belong[0]==1)
{
int temp=dp[j];
if(j>=a[i].price)
temp=max(dp[j],dp[j-a[i].price]+a[i].price*a[i].importance);
if(j>=a[i].price+a[a[i].belong[1]].price)
temp=max(temp,dp[j-a[i].price-a[a[i].belong[1]].price]+a[a[i].belong[1]].price*a[a[i].belong[1]].importance+a[i].price*a[i].importance);
dp[j]=temp;
}
if(a[i].belong[0]==2)
{
int temp=dp[j];
if(j>=a[i].price)
temp=max(dp[j],dp[j-a[i].price]+a[i].price*a[i].importance);
if(j>=a[i].price+a[a[i].belong[1]].price)
temp=max(temp,dp[j-a[i].price-a[a[i].belong[1]].price]+a[a[i].belong[1]].price*a[a[i].belong[1]].importance+a[i].price*a[i].importance);
if(j>=a[i].price+a[a[i].belong[1]].price+a[a[i].belong[2]].price)
temp=max(temp,dp[j-a[i].price-a[a[i].belong[1]].price-a[a[i].belong[2]].price]+a[a[i].belong[2]].price*a[a[i].belong[2]].importance+a[a[i].belong[1]].price*a[a[i].belong[1]].importance+a[i].price*a[i].importance);
dp[j]=temp;
}
}
}
}
cout<<dp[n];
return 0;
}