20分求助

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

某Dong @ 2018-01-03 10:44:46

#include <bits/stdc++.h>
using namespace std;
int main (){
    int n,m,p,q,s;
    int num[100]={0};
    int c[100][3]={},w[100][3]={},f[10005]={};
    cin>>m>>n;
    for(int i=1;i<=n;i++){
        cin>>s>>p>>q;
        if(!q){
            c[i][0]=s;
            w[i][0]=s*p;
        }
        else{
            num[q]++;
            c[q][num[q]]=c[q][0]+s;
            w[q][num[q]]=w[q][0]+s*p;
        }
    }
    for(int i=1;i<=n;i++)
        for(int v=m;v>=c[i][0]&&c[i][0]!=0;v-=10){
                f[v]=max(f[v],f[v-c[i][0]]+w[i][0]);
                if(v>=c[i][1])
                    f[v]=max(f[v],f[v-c[i][1]]+w[i][1]);
                if(v>=c[i][2])
                    f[v]=max(f[v],f[v-c[i][2]]+w[i][2]);
                if((v+c[i][0])>=(c[i][1]+c[i][2]))
                    f[v]=max(f[v],f[v+c[i][0]-c[i][1]-c[i][2]]+w[i][1]+w[i][2]-w[i][0]);    
        }
    cout<<f[m];
}

by _小妖 @ 2018-02-02 11:29:34

我一开始写的时候也是20分,这题把主附件打包之后是需要分组的,因为不分组可能会把主件1+附件1,主件1+附件2,主件1+附件1+附件2都选了,显然是错的


|