题目
分组背包
#include <iostream>
using namespace std;
int impw[70];
int impv[70];
int sidew[65][5];
int sidev[65][5];
int cnt1=0;
int cnt2[65]={0};
int f[32009];
int main()
{
int N;int n;
cin>>N>>n;
int money,im,sign;
for(int i=1;i<=n;i++)
{
cin>>money>>im>>sign;
if(sign==0){impw[i]=money;impv[i]=money*im;}
else
{
sidew[sign][cnt2[sign]]=money;///注意是cnt2[sign],不是cnt2[i]!!!
sidev[sign][cnt2[sign]++]=im*money;
}
}
for(int i=1;i<=n;i++)
{
if(impw[i]!=0)
{
for(int j=N;j>=0;j--)
{
///一共五种情况
f[j]=f[j];///不选
if(j>=impw[i])
f[j]=max(f[j],f[j-impw[i]]+impv[i]);///选主件
if(j>=sidew[i][0]+sidew[i][1]+impw[i])
f[j]=max(f[j],f[j-sidew[i][0]-sidew[i][1]-impw[i]]+sidev[i][0]+sidev[i][1]+impv[i]);///选主件和两个附件
if(j>=sidew[i][1]+impw[i])
f[j]=max(f[j],f[j-sidew[i][1]-impw[i]]+sidev[i][1]+impv[i]);///选主件和附件1
if(j>=sidew[i][0]+impw[i])
f[j]=max(f[j],f[j-sidew[i][0]-impw[i]]+sidev[i][0]+impv[i]);///选主件和附件0
}
}
}
cout<<f[N]<<endl;///注意输出的是f[N],而不是f[money]!!!
return 0;
}