60ptsWA#3#6#7#8#11

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

zzbzwjx @ 2024-09-17 19:55:47

#include<bits/stdc++.h>
using namespace std;
int n,m,v[66],w[66],f[320002],c[66][6];
//c[0][0]表示主件的数量
//c[i][0]表示主件为i的物品的数量
//c[i][j]表示主件为i的第j个物品的标号
int main(){
    cin>>n>>m;n/=10;
    for(int i=1,q;i<=m;i++){
        cin>>v[i]>>w[i]>>q;
        v[i]/=10;w[i]*=v[i];
        c[q][++c[q][0]]=i;
    }
    for(int i=1;i<=c[0][0];i++){
        int c1=c[0][i],c2=c[c[0][i]][1],c3=c[c[0][i]][2];
        for(int k=n;k>=v[c1];k--){
            int f1=f[k-v[c1]]+w[c1],//仅主件 
            f2=k-v[c1]-v[c2]>=0?f[k-v[c1]-v[c2]]+w[c1]+w[c2]:0,//加附件1
            f3=k-v[c1]-v[c3]>=0?f[k-v[c1]-v[c3]]+w[c1]+w[c3]:0,//加附件2
            f4=k-v[c1]-v[c2]-v[c3]>=0?f[k-v[c1]-v[c2]-v[c3]]+w[c1]+w[c2]+w[c3]:0;//全要 
            f[k]=max(f[k],max(f1,max(f2,max(f3,f4))));
        }
    }
    cout<<f[n]*10;
    return 0;
}

3输入

4500 12
100 3 0
400 5 0
300 5 0
1400 2 0
500 2 0
800 2 4
1400 5 4
300 5 0
1400 3 8
500 2 0
1800 4 0
440 5 10

正确输出

16700

我的输出

18200

|