请问各位大佬 这个程序哪里错了(只有70分)谢谢

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

Knight_Master @ 2019-08-13 15:29:21

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
long long n,m;
long long s=0;
long v[70][5],p[70][5];
long g[70];
long f[61][40010]={0};
int main(){
    cin>>n>>m;
    for(long i=1;i<=m;i++){
        g[i]=0;
    }
    for(long i=1;i<=m;i++)
    {
        long a,b,c;
        cin>>a>>b>>c;
        if(c==0) {
            s++;
            v[s][g[s]]=a;
            p[s][g[s]]=b*a;
            g[s]++;
            continue;
        }   
        if(c!=0){
            v[c][g[c]]=a;
            p[c][g[c]]=b*a;
            g[c]++;
        }
    }
    for(long i=1;i<=s;i++){
        for(long j=n;j>=0;j--){
            if(j-v[i][0]<0)   {

            f[i][j]=f[i-1][j];}

            if(j-v[i][0]>=0)  
             f[i][j]=max(f[i-1][j],f[i-1][j-v[i][0]]+p[i][0]);

            if(j-v[i][0]-v[i][1]>=0)   
            f[i][j]=max(f[i-1][j],f[i-1][j-v[i][0]-v[i][1]]+p[i][0]+p[i][1]);

            if(j-v[i][0]-v[i][2]>=0)  
             f[i][j]=max(f[i-1][j],f[i-1][j-v[i][0]-v[i][2]]+p[i][0]+p[i][2]);

            if(j-v[i][0]-v[i][1]-v[i][2]>=0)   
            f[i][j]=max(f[i-1][j],f[i-1][j-v[i][0]-v[i][1]-v[i][2]]+p[i][0]+p[i][1]+p[i][2]);

    }
    }
    cout<<f[s][n];

}

by Saber_Master @ 2019-08-13 15:30:01

送你正解

#include<bits/stdc++.h>
using namespace std;
long long n,V;
long long v[1001],w[1001],p[1001],f[10000000];
long long h[10001],t=0;
struct node{
    long long pr,im,tp;
}th[10001][5];
int main(){
    scanf("%lld%lld",&V,&n);
    for(long long i=1;i<=n;i++){
        scanf("%lld%lld%lld",&v[i],&w[i],&p[i]);
      if(!p[i]){
        th[++t][++h[t]].pr=v[i];
        th[t][h[t]].im=w[i]*v[i];
        th[t][h[t]].tp=i;
      } 
    }
    for(long long i=1;i<=n;i++){
        if(p[i]){
            for(long long j=1;j<=t;j++){
                if(th[j][1].tp==p[i]){
                    th[j][++h[j]].im=th[j][1].im+v[i]*w[i];
                    th[j][h[j]].pr=th[j][1].pr+v[i];
                    break;
                }
            }                                       
        }
    }
    for(long long i=1;i<=t;i++){
        if(h[i]==3){
            th[i][++h[i]].im=th[i][2].im+th[i][3].im-th[i][1].im;
            th[i][h[i]].pr=th[i][2].pr+th[i][3].pr-th[i][1].pr;
        }
    }
    for(long long i=1;i<=t;i++){
        for(long long j=V;j>=0;j--){
            for(long long k=1;k<=h[i];k++){
                if(j>=th[i][k].pr){
                    f[j]=max(f[j],f[j-th[i][k].pr]+th[i][k].im);
                }
            }
        }
    }
    printf("%lld",f[V]);
}

by Knight_Master @ 2019-08-13 15:31:27

@a3472002908 I dont want to know damage(代码); I want to know where my wrong


|