70分跪求dalao帮助

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

屈ll子 @ 2019-11-08 19:38:27

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
using namespace std;
const int maxn=10000;
int n,V;
int f[1000000];
int s[maxn],w[maxn],d[maxn],dp[maxn][5],v[maxn];
int main()
{
    memset(f,0,sizeof(f));
    memset(v,0,sizeof(v));
    memset(dp,0,sizeof(dp));
    scanf("%d%d",&V,&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d%d",&s[i],&w[i],&d[i]);
        w[i]*=s[i];
        if(d[i])dp[d[i]][++v[d[i]]]=i;
    }
//  cout<<dp[1][v[1]];
    for(int i=1;i<=n;i++)
    {
//      cout<<i<<"+++"<<endl;
        if(d[i])continue;
        for(int j=V;j>=s[i];j--)
            f[j]=max(f[j],f[j-s[i]]+w[i]);
        if(v[i]){
            int fu1=dp[i][1];
            int fu2=dp[i][2];
//          cout<<fu1<<" "<<fu2<<endl;
            for(int j=V;j>=s[i];j--)
            {
                if(j-s[i]-s[fu1]>=0&&fu1)
                  f[j]=max(f[j],f[j-s[i]-s[fu1]]+w[i]+w[fu1]);
                if(j-s[i]-s[fu2]>=0&&fu2)
                  f[j]=max(f[j],f[j-s[i]-s[fu2]]+w[i]+w[fu2]);
                if(j-s[i]-s[fu1]-s[fu2]>=0&&fu1&&fu2)
                  f[j]=max(f[j],f[j-s[i]-s[fu1]-s[fu2]]+w[i]+w[fu1]+w[fu2]);
            }
        }
    }
    int ans=0;
    for(int i=1;i<=V;i++)
       ans=max(ans,f[i]);
    cout<<ans<<endl;
    return 0;
}

by Axurez @ 2020-01-04 23:42:29

有没有 v[i] 的两个 for(int j=V;j>=s[i];j--) 循环应该合并起来,不然会干扰的。


|