比赛 202103省实验桐柏一中普及组联赛 评测结果 AAAWWWWWWW
题目名称 自助者天助 最终得分 30
用户昵称 云浅QwQ 运行时间 0.208 s
代码语言 C++ 内存使用 8.17 MiB
提交时间 2021-03-22 18:14:29
显示代码纯文本
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<map>

#define int long long

using namespace std;

struct Node{
	int w,v;
}dat[30005];

int n,m;
int mp[1005][1005];
int id[105];
int cnt=0;
int a[105],b[105],c[105];
int num=0;
int w[105],v[105];
int f[30005];

signed main(void){
	
	freopen("delicious.in","r",stdin);
	freopen("delicious.out","w",stdout);
	
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>dat[i].w>>dat[i].v;
		if(!mp[dat[i].w][dat[i].v])id[++cnt]=i,mp[dat[i].w][dat[i].v]=1;
		else mp[dat[i].w][dat[i].v]++;
	}
	
	for(int i=1;i<=cnt;i++){
		a[i]=dat[id[i]].w;
		b[i]=dat[id[i]].v;
		c[i]=mp[dat[id[i]].w][dat[id[i]].v];
	}
	
	n=cnt;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=c[i];j*=2){
			v[++num]=j*b[i];
			w[num]=j*a[i];
			c[i]-=j;
		}
		if(c[i]!=0){
            v[++num]=b[i]*c[i];
            w[num]=a[i]*c[i];
        }
	}
	
	for(int i=1;i<=num;++i){
        for(int j=m;j>=w[i];--j){
            f[j]=max(f[j],f[j-w[i]]+v[i]);
        }
    }
    
    cout<<f[m]<<endl;
	
	return 0;
}