40pts求助

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

Ming_Yu @ 2022-10-24 18:23:11

#include <bits/stdc++.h>
using namespace std;
int n,m;
struct p
{
    int w,v,fu=0;
    struct q
    {
        int w,v;
    } scd[3];
} fst[32005];
int dp[234500];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>m>>n;
    int a,b,c;

    for(int i=1; i<=n; i++)
    {
        cin>>a>>b>>c;
        if(c==0)
        {
            fst[i].w=a;
            fst[i].v=a*b;
        }
        else
        {
            fst[c].scd[++fst[c].fu].w=a;
            fst[c].scd[fst[c].fu].v=a*b;
        }
    }
    for(int i=1; i<=n; i++)
        for(int j=m; j>=fst[i].w&&fst[i].w!=0; j--)
        {
            dp[j]=max(dp[j-fst[i].w]+fst[i].v,dp[j]);
            if(j>=fst[i].w+fst[i].scd[1].w)
                dp[j]=max(dp[j],dp[j-fst[i].w-fst[i].scd[1].w]+fst[i].v+fst[i].scd[1].v);
            if(j>=fst[i].w+fst[i].scd[2].w)
                dp[j]=max(dp[j],dp[j-fst[i].w-fst[i].scd[2].w]+fst[i].v+fst[i].scd[1].v);

            if(j>=fst[i].w+fst[i].scd[1].w+fst[i].scd[2].w)
                dp[j]=max(dp[j],dp[j-fst[i].w-fst[i].scd[1].w-fst[i].scd[2].w]+fst[i].v+fst[i].scd[1].v+fst[i].scd[2].v);
        }
    cout<<dp[m];
    return 0;
}

|