编辑代码

#include <stdio.h>

#define Max(x,y) (x>y?x:y)

int main (void) 
{
    int N,m;
    int i=0,j=0;
    scanf("%d %d",&N,&m);

    int val[m+1][3];
    int wei[m+1][3];
    int dp[3200]={0};

    memset(val,0,(m+1)*3*sizeof(int));
    memset(wei,0,(m+1)*3*sizeof(int));

    for(i=1;i<=m;i++)
    {
        int v,p,q;
        scanf("%d %d %d",&v,&p,&q);

        if(q==0)//主件
        {
            val[i][0]=v/10;
            wei[i][0]=p*v/10;
        }
        else if(val[q][1]==0)//附件1
        {
            val[q][1]=v/10;
            wei[q][1]=p*v/10;
        }
        else//附件2
        {
            val[q][2]=v/10;
            wei[q][2]=p*v/10;
        }
    }

    /*for(i=1;i<=m;i++)
    {
        printf("%d   %d-%d;%d-%d;%d-%d\n",i,val[i][0],wei[i][0],val[i][1],wei[i][1],val[i][2],wei[i][2]);
    }*/

    for(i=1;i<=m;i++)
    {
        for(j=N/10;j>0;j--)
        {
            if(val[i][0]<=j)//主件
            {
                dp[j]=Max( dp[j] , wei[i][0] + dp[j-val[i][0]] );
            }

            if((val[i][0] + val[i][1]) <= j)//主件+附件1
            {
                dp[j]=Max( dp[j] , wei[i][0] + wei[i][1] + dp[j - val[i][0] - val[i][1]] );
            }

            if((val[i][0] + val[i][2]) <= j)//主件+附件2
            {
                dp[j]=Max( dp[j] , wei[i][0] + wei[i][2] + dp[j - val[i][0] - val[i][2]] );
            }

            if((val[i][0] + val[i][1] + val[i][2])<=j)//主件+附件1+附件2
            {
                dp[j]=Max( dp[j] , wei[i][0] + wei[i][1] + wei[i][2] + dp[j - val[i][0] - val[i][1] - val[i][2]] );
            }
        }
    }

    printf("%d",dp[N/10]*10);
}