c++60分求解

P1064 [NOIP2006 提高组] 金明的预算方案

Paul_Ac @ 2016-11-06 16:08:57

#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cstring>
int f[100][40000];
int v[100];
int w[100];
int p[100]; 
int a[100][3][3];//附件
int b[100][3];//主件 
int n,m;
int max(int x,int y)
{
    if(x>y) return x;
        else return y;
}
int main()
{
    scanf("%d %d",&n,&m);
    int q=0;
    for(int i=1;i<=m;i++)
    {
        int x,y,z;
        scanf("%d %d %d",&x,&y,&z);
        if(z==0)
        {
            q++;
            b[q][0]=x;//价格
            b[q][1]=y;//重要 
        } 
        else
        {
            if(a[z][0][1]==0)
            {
                a[z][0][0]=x;//价格
                a[z][0][1]=y;//重要 
            }
            else
            {
                a[z][1][0]=x;
                a[z][1][1]=y;

}//附件2

        }
    }
    int x=1;//总计数
    int y=1;//主件个数
    while(x<=m)//v价格,w重要,p
    {
        v[x]=b[y][0];
        w[x]=b[y][1];
        p[x]=0;
        if(a[y][0][0]!=0)
        {
            x++;
            v[x]=a[y][0][0];
            w[x]=a[y][0][1];
            p[x]=1;        
            if(a[y][1][0]!=0)
            {
                x++;
                v[x]=a[y][1][0];
                w[x]=a[y][1][1];
                p[x]=1;        
            }
        }
        x++;
        y++;
    } 
    for(int i=1;i<=m;i++)
        for(int j=n;j>=0;j--)
            if(j>=v[i]&& p[i]==0 )//判断主件 
            {
                f[i][j]=max(f[i-1][j-v[i]]+v[i]*w[i],f[i-1][j]);
                if(j>=v[i]+v[i+1] && p[i+1]!=0 ) 
                    f[i][j]=max(f[i-1][j-v[i]-v[i+1]]+v[i]*w[i]+v[i+1]*w[i+1],f[i-1][j]);
                if(j>=v[i]+v[i+2] && p[i+2]!=0 )
                    f[i][j]=max(f[i-1][j-v[i]-v[i+2]]+v[i]*w[i]+v[i+2]*w[i+2],f[i-1][j]);
                if(j>=v[i]+v[i+1]+v[i+2] && p[i+1]!=0 && p[i+2]!=0)
                    f[i][j]=max(f[i-1][j-v[i]-v[i+1]-v[i+2]]+v[i]*w[i]+v[i+1]*w[i+1]+v[i+2]*w[i+2],f[i-1][j]);
            }
                else f[i][j]=f[i-1][j];
    printf("%d",f[m][n]);
     return 0;
}

|