简单背包,萌新求救。。。

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

Dr_MING @ 2022-11-14 21:50:43

rt,芝士代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=70;
int cmax,n,cnt;
int w[maxn][3],f1[maxn][3],f2[maxn][3],f[51419];
int red(){
    int as=0;int fl=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')fl=-1;ch=getchar();}
    while(isdigit(ch)){as=as*10+ch-'0';ch=getchar();}
    return as*fl;
}
int main(){
    cmax=red();n=red();
    for(int i=1;i<=n;i++){
        int x,y,z;
        x=red();y=red();z=red();
        if(!z){
            cnt++;
            w[cnt][1]=x;
            w[cnt][2]=x*y;
        }
        if(z){
            if(!f1[z][1]){
                f1[z][1]=x;
                f1[z][2]=x*y;
            }
            else{
                f2[z][1]=x;
                f2[z][2]=x*y;
            }
        }
    }
    for(int i=1;i<=cnt;i++){
        for(int j=cmax;j>=w[i][1];j--){
            f[j]=max(f[j],f[j-w[i][1]]+w[i][2]);
            if(w[i][1]+f1[i][1]<=j)
                f[j]=max(f[j],f[j-w[i][1]-f1[i][1]]+w[i][2]+f1[i][2]);
            if(w[i][1]+f2[i][1]<=j)
                f[j]=max(f[j],f[j-w[i][1]-f2[i][1]]+w[i][2]+f2[i][2]);
            if(w[i][1]+f1[i][1]+f2[i][1]<=j)
                f[j]=max(f[j],f[j-w[i][1]-f1[i][1]-f2[i][1]]+w[i][2]+f1[i][2]+f2[i][2]);
        }
    }
    printf("%d",f[cmax]);
    return 0;
}

|