10分求助

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

Steiner @ 2022-04-03 15:14:35

#include <iostream>
using namespace std;
long long dp[32010],v[32010],w[32010];
int maini[32010][2]={0};
bool ismain[32010];
int main()
{
    int n,m,ans=0;
    cin>>n>>m;
    for(int i=0;i<m;i++)
    {
        int q;
        cin>>v[i]>>w[i]>>q;
        w[i]*=v[i];
        if(q==0) ismain[i]=true;
        else if(maini[0]==0) maini[q][0]=i;
        else maini[q][1]=i;
    }
    for(int i=0;i<m;i++)
    if(ismain[i]) for(int j=n;j>=v[i];j--)
    {
        dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
        if(j>=v[maini[i][0]]+v[maini[i][1]]+v[i]) dp[j]=max(dp[j],dp[j-v[i]-v[maini[i][0]]-v[maini[i][1]]]+w[maini[i][0]]+w[maini[i][1]]+w[i]);
        if(j>=v[maini[i][0]]+v[i]) dp[j]=max(dp[j],dp[j-v[i]-v[maini[i][0]]]+w[maini[i][0]]+w[i]);
        if(j>=v[maini[i][1]]+v[i]) dp[j]=max(dp[j],dp[j-v[i]-v[maini[i][1]]]+w[maini[i][1]]+w[i]);
    }
    cout<<dp[n];
    return 0;
 }

|