记录编号 380385 评测结果 AAAAAAAAAA
题目名称 采药(加强版) 最终得分 100
用户昵称 GravatarHeHe 是否通过 通过
代码语言 C++ 运行时间 0.850 s
提交时间 2017-03-09 08:31:38 内存使用 6.04 MiB
显示代码纯文本
//\
2230.采药(加强版)

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define is_num(tmp) (tmp<='9' and tmp>='0')
inline int in(void){
	char tmp(getchar());
	int res(0),f(1);
	while(!(is_num(tmp)||tmp=='-'))tmp=getchar();
	if(tmp=='-')f=-1,tmp=getchar();
	while(is_num(tmp))
		res=(res<<1)+(res<<3)+(tmp^48),
		tmp=getchar();
	return res*f;
}//\
#define LOCAL
#define MAXN 250250
template<typename T>
T my_min(const T&a,const T&b){
	return a<b?a:b;
}
template<typename T>
T my_max(const T&a,const T&b){
	return a<b?b:a;
}
int _c[MAXN],_v[MAXN],_w[MAXN],_cnt,cnt;
int v[MAXN],w[MAXN];
int dp[MAXN];
int N,W,s1,s2;
int main(){
#ifndef LOCAL
	freopen("crazytime.in","r",stdin);
	freopen("crazytime.out","w",stdout);
#endif
	N=in(),W=in();
	for(int i=1;i<=N;++i){
		s1=in(),s2=in();
		bool flag=true;
		for(int i=1;i<=_cnt;++i){
			if(_v[i]==s1&&_w[i]==s2){
				++_c[i],flag=false;
				break;
			}
		}
		if(flag){
			++_cnt;
			_v[_cnt]=s1,_w[_cnt]=s2;
			_c[_cnt]=1;
		}
	}
	for(int i=1;i<=_cnt;++i){
		int t=1;
		while(_c[i]>=t){
			++cnt;
			v[cnt]=_v[i]*t;
			w[cnt]=_w[i]*t;
			_c[i]-=t;
			t*=2;
		}
		++cnt;
		v[cnt]=_c[i]*_v[i];
		w[cnt]=_c[i]*_w[i];
	}
	for(int i=1;i<=cnt;++i){
		for(int j=W;j>=v[i];--j){
			dp[j]=my_max(dp[j],dp[j-v[i]]+w[i]);
		}
	}
	printf("%d",dp[W]);
	return 0;
}