2号和7号数据点不对。
#include<stdio.h>
int pay[60][3];
int zhi[60][3];
int n,money;
int dp()
{
int max[61][3201];
int i,j,k;
for(i=0;i<=money;i++)
max[0]=0;
for(i=1;i<=n;i++)
{
for(j=0;j<=money;j++)
{
if(pay[0]>j)
{
max[j]=max[i-1][j];
continue;
}
if(max[i-1][j-pay[0]]+zhi[0]>max[i-1][j])
max[j]=max[i-1][j-pay[0]]+zhi[0];
else
max[j]=max[i-1][j];
if(pay[0]+pay[1]<=j && max[i-1][j-pay[0]-pay[1]]+zhi[0]+zhi[1]>max[i-1][j])
max[j]=max[i-1][j-pay[0]-pay[1]]+zhi[0]+zhi[1];
if(pay[0]+pay[2]<=j && pay[1]<pay[2] && max[i-1][j-pay[0]-pay[2]]+zhi[0]+zhi[2]>max[i-1][j])
max[j]=max[i-1][j-pay[0]-pay[2]]+zhi[0]+zhi[2];
if(pay[0]+pay[1]+pay[2]<=j && max[i-1][j-pay[0]-pay[1]-pay[2]]+zhi[0]+zhi[1]+zhi[2]>max[i-1][j])
max[j]=max[i-1][j-pay[0]-pay[1]-pay[2]]+zhi[0]+zhi[1]+zhi[2];
}
}
return max[n][money];
}
int main()
{
FILE *f;
int i,k,num,fu,w;
int wu[60][3];
f=fopen("budget.in","r");
fscanf(f,"%d %d\n",&money,&w);
money/=10;
for(i=1;i<=w;i++)
{
fscanf(f,"%d %d %d\n",&wu[0],&wu[1],&wu[2]);
wu[0]/=10;
wu[1]*=10;
}
for(i=1;i<=w;i++)
for(k=0;k<=2;k++)
{
pay[k]=0;
zhi[k]=0;
}
fclose(f);
n=0;
for(i=1;i<=w;i++)
{
if(wu[2]!=0)
continue;
pay[++n][0]=wu[0];
zhi[n][0]=wu[0]*wu[1];
fu=0;
for(k=1;k<=w;k++)
{
if(wu[k][2]==i)
{
fu++;
pay[n][fu]=wu[k][0];
zhi[n][fu]=wu[k][0]*wu[k][1];
if(fu==2)
break;
}
}
}
printf("%ld\n",dp()); /*为了直观,直接输出到屏幕*/
}