50pts求调

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

Blamol_Von_Lee @ 2023-11-01 18:43:33

#include<iostream>
using namespace std;
int t[320300],c[320100],q[321000],jg[320100],jg1[320100],jg2[320100],f[320100]={};
int dp[390050];
inline int maxx(int x,int y)
{
    return x>y?x:y;
}
int main()
{
    int n,m,k=0,cnt=0;
    cin>>m>>n;
    for(int i=1;i<=n;i++){
        cin>>t[i]>>c[i]>>q[i];
        if(q[i]!=0)
            f[q[i]]++;
        jg[i]=t[i]*c[i];
        if(f[q[i]]==1&&q[i]!=0)
            jg1[i]=t[i]*c[i];
        if(f[q[i]]==2&&q[i]!=0)
            jg2[i]=t[i]*c[i];
    }
    for(int i=1;i<=n;i++)
    {
        if(cnt==i){
            cnt=0;
            k=0;
            continue;
        }
//      cout<<endl;
        for(int j=m;j>=t[i];j--)
        {
            if(f[i]==0&&q[i]==0)
            {
                dp[j]=maxx(dp[j],dp[j-t[i]]+jg[i]);
//              cout<<dp[j]<<" ";
            }
            else if(q[i]!=0)
            {
                if(f[q[i]]==1)
                {
                    if(j>=(t[i]+t[q[i]]))
                    dp[j]=maxx(dp[j],maxx(dp[j-t[q[i]]]+jg[q[i]],dp[j-(t[i]+t[q[i]])]+jg1[i]+jg[q[i]]));
                    else if(j>=t[q[i]])
                    dp[j]=maxx(dp[j],dp[j-t[q[i]]+jg[q[i]]]);
//                  cout<<dp[j]<<" ";
                }
                else
                {
                    for(int ans=i+1;ans<=n;ans++)
                        if(q[ans]==q[i])
                        {
                            k=ans;
                            cnt=ans;
                            break;
                        }
                    if(j>=(t[i]+t[q[i]]+t[k]))
                        dp[j]=maxx(dp[j],(maxx(dp[j-t[q[i]]-t[k]]+jg[q[i]]+jg2[k],maxx(maxx(dp[j-t[q[i]]]+jg[q[i]],dp[j-(t[i]+t[q[i]])]+jg1[i]+jg[q[i]]),dp[j-(t[i]+t[q[i]]+t[k])]+jg[q[i]]+jg1[i]+jg2[k]))));
                    else if(((j>=(t[i]+t[q[i]]))||(j>=(t[q[i]]+t[k])))&&j<(t[i]+t[q[i]]+t[k]))
                    {
                        if(j<(t[i]+t[q[i]])&&j>=(t[q[i]]+t[k]))
                        dp[j]=maxx(dp[j],dp[j-(t[q[i]]+t[k])]+jg[q[i]]+jg2[k]);
                        else if(j<(t[q[i]]+t[k])&&j>=(t[i]+t[q[i]]))
                        dp[j]=maxx(dp[j],dp[j-(t[i]+t[q[i]])]+jg[q[i]]+jg1[k]);
                        else if(((j>=(t[i]+t[q[i]]))&&(j>=(t[q[i]]+t[k]))))
                        dp[j]=maxx(dp[j],maxx(dp[j-(t[q[i]]+t[k])]+jg[q[i]]+jg2[k],dp[j-(t[i]+t[q[i]])]+jg[q[i]]+jg1[i]));
                        else if(j>=t[q[i]])
                        dp[j]=maxx(dp[j],dp[j-t[q[i]]+jg[q[i]]]);
//                      cout<<dp[j]<<" ";
                    }
                }
            }
        }
    }
    cout<<dp[m];
    return 0;
}

|