v[i][0]主件,v[i][1]附件1,v[i][2]附件2.每次决策时最多四种。转化为01背包。
#include<cstdio>
#include<cstring>
int n,m,a,b,c,v[60][3],p[60][3],f[32000],k=0;
int main(){
// freopen("testdata.in","r",stdin);
scanf("%d%d",&n,&m);
n/=10;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&a,&b,&c);
if(c==0) c=i;
for(int j=0;j<=2;j++){
if(v[c][j]==0){
v[c][j]=a/10;
p[c][j]=v[c][j]*b;
break;
}
}
}
memset(f,0,sizeof(f));
for(int i=1;i<=m;i++){
if(v[i][0]!=0){
int v0,v1,v2,p0,p1,p2;
v0=v[i][0];p0=p[i][0];
v1=v[i][1];p1=p[i][1];
v2=v[i][2];p2=p[i][2];
for(int j=n;j>=v0;--j){
if(f[j-v0]+p0>f[j]) f[j]=f[j-v0]+p0;
if(j>=v0+v1&&f[j-v0-v1]+p0+p1>f[j]) f[j]=f[j-v0-v1]+p0+p1;
if(j>=v0+v2&&f[j-v0-v2]+p0+p2>f[j]) f[j]=f[j-v0-v2]+p0+p2;
if(j>=v0+v1+v2&&f[j-v0-v1-v2]+p0+p1+p2>f[j]) f[j]=f[j-v0-v1-v2]+p0+p1+p2;
}
}
}
printf("%d",f[n]*10);
return 0;
}