这是题目:
我的代码:
#include<bits/stdc++.h>
#define I using
#define AK namespace
#define IOI std
#define i_ak return
#define ioi 0
#define i_will signed
#define ak main
#define IMO ()
#define int long long
#define double long double
I AK IOI;
int n,m,C,v[5005],w[5005],c[5005],lim[5005],sum[5005],cnt[5005],dp[5005];
vector<int>weight[5005],value[5005],vv[5005],ww[5005];
void solve(int n,int W,vector<int>weights,vector<int>values,int sum_val,int type){
const int MAX_VAL=sum_val;
vector<int>min_weight;
vector<bitset<100005>>dp(W+1);
dp[0].set(0);
min_weight.assign(MAX_VAL+1,INT_MAX);
min_weight[0]=0;
for(int i=0;i<n;i++){
int wi=weights[i],vi=values[i];
for(int w=W-wi;w>=0;w--){
if(dp[w].any()){
int new_w=w+wi;
if(new_w>W)continue;
dp[new_w]|=dp[w]<<vi;
}
}
}
for(int w=0;w<=W;w++){
bitset<100005>&bs=dp[w];
for(int v=0;v<=MAX_VAL;v++)if(bs.test(v))if(w<min_weight[v])min_weight[v]=w;
}
bitset<100005>res;
for(int w=0;w<=W;w++)res|=dp[w];
for(int v=0;v<=MAX_VAL;v++){
if(res.test(v)){
vv[type].push_back(v);
ww[type].push_back(min_weight[v]);
}
}
}
i_will ak IMO{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
//freopen("diversity.in","r",stdin);
//freopen("diversity.out","w",stdout);
cin>>n>>m>>C;
for(int i=1;i<=n;i++){
cin>>v[i]>>w[i]>>c[i];
sum[c[i]]+=v[i];
cnt[c[i]]++;
weight[c[i]].push_back(w[i]);
value[c[i]].push_back(v[i]);
}
for(int i=1;i<=C;i++)cin>>lim[i];
for(int i=1;i<=C;i++)solve(cnt[i],lim[i],weight[i],value[i],sum[i],i);
for(int i=1;i<=C;i++){
vector<int>pre(dp,dp+m+1);
for(int j=0;j<ww[i].size();j++){
int wt=ww[i][j],vt=vv[i][j];
for(int k=m;k>=wt;k--){
dp[k]=max(dp[k],pre[k-wt]+vt);
}
}
}
cout<<dp[m];
i_ak ioi;
}
可过样例,测试点全部 RE?