只过了前两个数据,,,救救孩子!!!

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

阿沐 @ 2019-06-26 21:31:10

#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
ll n,m,v,p,q,cnt[3],t,l;
ll f[32001],b[32001];
struct ttp{
    ll v;
    ll w;
    ll q;
}a[61][5];

int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>v>>p>>q;

        if(!q)
        {

             b[i]=i;
            a[i][0].v=v;
            a[i][0].w=v*p;
        //  a[b[i]][0].q=q;

        }
        else 
        {    
            b[i]=q;
            cnt[q]++;
            a[b[i]][cnt[q]].v=v;
            a[b[i]][cnt[q]].w=v*p;

        }
    }
    for(int i=1;i<=m;i++)
    for(int j=n;j>=a[b[i]][0].v;j--)
    {

            if(a[b[i]][0].v)
            {
                t=a[b[i]][0].v;
                l=a[b[i]][0].w;
                if(j>=t)
                f[j]=max(f[j],f[j-t]+l);
            }
            if(a[b[i]][1].v)
            {
                t=a[b[i]][0].v+a[b[i]][1].v;
                l=a[b[i]][0].w+a[b[i]][1].w;
                if(j>=t)
                f[j]=max(f[j],f[j-t]+l);
            }
            if(a[b[i]][2].v)
            {
                t=a[b[i]][0].v+a[b[i]][2].v;
                l=a[b[i]][0].w+a[b[i]][2].w;
                if(j>=t)
                f[j]=max(f[j],f[j-t]+l);

            }
           if(a[b[i]][1].v&&a[b[i]][2].v)
           {
                t=a[b[i]][0].v+a[b[i]][1].v+a[b[i]][2].v;
                l=a[b[i]][0].w+a[b[i]][1].w+a[b[i]][2].w;
                if(j>=t)
                f[j]=max(f[j],f[j-t]+l);
           }

    }
    cout<<f[n];
    return 0;
}

/*
2000 10
500 1 0
400 4 0
300 5 1
400 5 1
200 5 0
500 4 5
400 4 0
320 2 0
410 3 0
400 3 5

7430
*/

|