10分啊!求大神!!!

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

许默 @ 2016-10-20 18:49:19

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace  std;
int a[67],w[67],p[67],n,m,ans,k,f[32007],wl[67],pl[67],x[67];
bool flag=0;
int main()
{
    //freopen("in.txt","r",stdin);
    pl[0]=1,wl[0]=1;
    scanf("%d%d",&m,&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d%d",&w[i],&p[i],&x[i]);
        p[i]=w[i]*p[i];
    }
    memset(f,0,sizeof(f));
    f[w[1]]=p[1];
    ans=w[1];
    k=1;
    for(int i=2;i<=n;i++)
    if(!x[i])
    {
        for(int j=ans;j>=w[k];j--)
        if(f[j])
        {
            wl[wl[0]++]=j,pl[pl[0]++]=f[j];
        }
        memset(f,0,sizeof(f));
        f[w[i]]=p[i];
        ans=w[i],flag=0;
        k=i;
    }
    else
    {
        ans+=w[i];
        for(int j=ans;j>=w[i];j--)
        if(f[j-w[i]]&&f[j]<f[j-w[i]]+p[i])
        {
        f[j]=f[j-w[i]]+p[i];
        }
        flag=1;
    }    
        for(int j=ans;j>=w[k];j--)
        if(f[j])
        {
            wl[wl[0]++]=j;
            pl[pl[0]++]=f[j];
        }
    for(int i=1;i<pl[0];i++)
    for(int j=m;j>=wl[i];j--)
    f[j]=max(f[j],f[j-wl[i]]+pl[i]);
    printf("%d\n",f[m]);
    return 0;
}

|