80pts 求助

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

_JF_ @ 2023-08-18 13:28:02

调了很久无果

#include<bits/stdc++.h>
using namespace std;
#define int long long  
const int N = 4e4;
vector<int> g[N];
int dp[70][N],v[N],w[N],q[N],Max;
signed main(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=m;i++)
        cin>>v[i]>>w[i]>>q[i];
    for(int i=1;i<=m;i++){
        if(q[i]==0){
            Max++,g[Max].push_back(i);
            for(int j=1;j<=m;j++)   if(q[j]==i) g[Max].push_back(j);
        }
    }
    for(int i=1;i<=Max;i++) sort(g[i].begin()+1,g[i].end());
    bool f=true;
    for(int i=1;i<=Max;i++){
        // slove that only one 
        if(g[i].size()==1){
            int Now=g[i][0];
            for(int k=n;k>=v[Now];k--){
                dp[i][k]=max(max(dp[i-1][k],dp[i][k]),max(dp[i][k-v[Now]],dp[i-1][k-v[Now]])+v[Now]*w[Now]);
            }
            for(int k=v[Now]-1;k>=0;k--)
                dp[i][k]=dp[i-1][k];
            continue;
        }
        // Slove the others expect first  
        for(int j=1;j<g[i].size();j++){
            int now=g[i][j];
            for(int k=n;k>=v[now];k--)
                dp[i][k]=max(max(dp[i][k],dp[i-1][k]),max(dp[i][k-v[now]],dp[i-1][k-v[now]])+v[now]*w[now]);
        }
        // clear the unuse
        for(int j=n;j>=0;j--){
            if(j+v[g[i][0]]>n)  dp[i][j]=dp[i-1][j];
            else{
                dp[i][j+v[g[i][0]]]=max(max(dp[i-1][j+v[g[i][0]]],dp[i][j+v[g[i][0]]]),dp[i][j]+v[g[i][0]]*w[g[i][0]]),dp[i][j]=dp[i-1][j];
            }
        } 
    }
    int ans=0;
    for(int i=1;i<=Max;i++){
        for(int j=n;j>=0;j--)   
            ans=max(ans,dp[i][j]);
//      cout<<ans<<endl;
    }
    cout<<ans<<endl;
}

by protractor @ 2023-08-20 22:13:30

最后两个点?


|