求大佬看看这个80分的代码有哪里不对,5,6点WA了

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

c20191623 @ 2019-02-18 15:55:07

#include<bits/stdc++.h>
using namespace std;
int n,v,tc[70],tw[70],tp[70],w[70][3],c[70][3],f[32010],num[70];
bool zj[70];
inline void read(int &res){
    char ch;bool flag=false;
    while(!isdigit(ch=getchar())) (ch=='-')&&(flag=true);
    for(res=ch-48;isdigit(ch=getchar());res=res*10+ch-48);
    (flag)&&(res=-res);
}
int main(){
    read(v),read(n);
    for(int i=1;i<=n;i++){
        read(tw[i]),read(tc[i]),read(tp[i]);
    }
    for(int i=1;i<=n;i++){
        if(!tp[i]){
            zj[i]=true;
            w[i][0]=tw[i];
            c[i][0]=tc[i]*tw[i];
        }
        else{
            num[tp[i]]++;
            if(!w[tp[i]][1]) w[tp[i]][1]=tw[i],c[tp[i]][1]=tc[i]*tw[i];
            else w[tp[i]][2]=tw[i],c[tp[i]][2]=tc[i]*tw[i];
        }
    }
    for(int i=1;i<=n;i++){
        if(!zj[i]) continue;
        if(num[i]==0) for(int j=v;j>=w[i][0];j--) f[j]=max(f[j],f[j-w[i][0]]+c[i][0]);
        if(num[i]==1) for(int j=v;j>=w[i][0]+w[i][1];j--) f[j]=max(max(f[j],f[j-w[i][0]-w[i][1]]+c[i][0]+c[i][1]),f[j-w[i][0]]+c[i][0]);
        if(num[i]==2) for(int j=v;j>=w[i][0]+w[i][1]+w[i][2];j--) f[j]=max(max(f[j],f[j-w[i][0]-w[i][1]]+c[i][0]+c[i][1]),max(f[j-w[i][0]]+c[i][0],f[j-w[i][0]-w[i][1]-w[i][2]]+c[i][0]+c[i][1]+c[i][2]));
    }
    printf("%d",f[v]);
    return 0;
}

by 吃的 @ 2019-03-17 14:27:08

我是90分的 第六个点WA


|