求助60分!!!

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

wuzeming @ 2020-01-01 09:25:52

#include<bits/stdc++.h>
using namespace std;
int i,j,n,m,k,l,ans,t,w,a[10000][3],b[10000][3],f[32001];
int main()
{
    scanf("%d%d",&m,&n);
    memset(f,0,sizeof(f));
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    for (int i=1;i<=n;i++)
    {
        scanf("%d%d%d",&k,&l,&w);
        if (w==0) t=t+1,a[t][0]=k,b[t][0]=l*k;
        else if (a[w][1]==0) a[w][1]=k,b[w][1]=l*k;
               else a[w][2]=k,b[w][2]=l*k;
    }
    for (int i=1;i<=t;i++)
      for (int j=m;j>=a[i][0];j--)
      {
        f[j]=max(f[j],f[j-a[i][0]]+b[i][0]);
        if (j>=a[i][0]+a[i][1]) 
          f[j]=max(f[j],f[j-a[i][0]-a[i][1]]+b[i][0]+b[i][1]);
        if (j>=a[i][0]+a[i][2]) 
          f[j]=max(f[j],f[j-a[i][0]-a[i][2]]+b[i][0]+b[i][2]);
        if (j>=a[i][0]+a[i][2]+a[i][1]) 
          f[j]=max(f[j],f[j-a[i][0]-a[i][1]-a[i][2]]+b[i][0]+b[i][2]+b[i][1]);
      }
    for (int i=1;i<=m;i++) ans=max(ans,f[i]);
    cout<<ans<<endl;
}

|