3732 Ahui Writes Word

时间:2023-03-08 17:14:39
3732 Ahui Writes Word
// N个物品 放进容量为C的背包里面 要求价值最大
// 一看 第一反应是0 1背包 不过 N=100000 C=10000
// 注意到 v,c在 10以内
// 那么 最多就100种组合了 然后就转化为 多重背包了
// dp
#include <iostream>
#include <string>
#include <map>
#include <algorithm>
#include <queue>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
#define MOD 1000000007
#define maxn 10010
int dp[maxn];
int mp[][]; // v,c
char str[];
//int use[maxn*10];
int main(){
int i,j,k;
int n,c;
int u,v;
while(scanf("%d %d",&n,&c)!=EOF){
memset(mp,,sizeof(mp));
for(i=;i<n;i++){
scanf("%s %d %d",str,&u,&v);
// printf("%s ");
mp[u][v]++;
}
for(i=;i<=c;i++) dp[i]=;
int tp;
for(u=;u<=;u++)
for(v=;v<=;v++){
if(mp[u][v]){
k=;
while(mp[u][v]>=k){
tp=k*v;
for(j=c;j>=tp;j--)
if(dp[j]<dp[j-tp]+k*u)
dp[j]=dp[j-tp]+k*u;
mp[u][v]-=k;
k=k<<;
}
if(mp[u][v]){
k=mp[u][v];
tp=k*v;
for(j=c;j>=tp;j--)
if(dp[j]<dp[j-tp]+k*u)
dp[j]=dp[j-tp]+k*u;
}
}
}
printf("%d\n",dp[c]);
}
return ;
}