求助,20pts

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

what_else @ 2022-08-02 20:30:49

#include<bits/stdc++.h>
using namespace std;
int dp[33900];
struct thing{
    int w;
    int v;
    int q;
    int fj1;
    int fj2;
}s[70];
int n,m;
int main(){
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        cin>>s[i].w>>s[i].v>>s[i].q;
        if(s[i].q!=0){
            int to=s[i].q;
            if(s[to].fj1==0)s[to].fj1=i;
            else s[to].fj2=i;
        }//设置附件1,2
    }
    for(int i=1;i<=m;i++){
        if(s[i].q!=0)continue;
        for(int j=n;j>=s[i].w;j--)
        dp[j]=max(dp[j],dp[j-s[i].w]+s[i].w*s[i].v);//考虑一般情况
        if(s[i].fj1!=0){
            int abst=s[i].w+s[s[i].fj1].w,ret=s[i].fj1;
            for(int j=n;j>=abst;j--)
            dp[j]=max(dp[j],dp[j-abst]+s[i].w*s[i].v+s[ret].w*s[ret].v);//主+1
            if(s[i].fj2!=0){
                int uhj=s[i].w+s[s[i].fj2].w,rst=s[i].fj2;
                for(int j=n;j>=uhj;j--)
                dp[j]=max(dp[j],dp[j-uhj]+s[i].w*s[i].v+s[rst].w*s[rst].v);//主+2
                int mem=s[i].w+s[s[i].fj1].w+s[s[i].fj2].w;
                for(int j=n;j>=mem;j--)
                dp[j]=max(dp[j],dp[j-mem]+s[i].w*s[i].v+s[ret].w*s[ret].v+s[rst].w*s[rst].v);//主+1+2
            }
        }
    }
    cout<<dp[n];
}

|