比赛 15级练手赛 评测结果 AAAAAAAAAA
题目名称 采药(加强版) 最终得分 100
用户昵称 雾茗 运行时间 2.609 s
代码语言 C++ 内存使用 3.61 MiB
提交时间 2018-08-02 16:43:43
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int m,n,f[40001],a,b,ans=0,w[40001],v[40001],t,mp[21][21];
int main(){
    freopen("crazytime.in","r",stdin);
    freopen("crazytime.out","w",stdout);
    cin>>n>>m;
    for(int i=1;i<=n;i++){
    	cin>>a>>b;
    	mp[a][b]+=1;
	}
	for(int i=1;i<=20;i++){
		for(int j=1;j<=20;j++){
			t=1;
			while(mp[i][j]>=t){
				ans+=1;
				v[ans]=t*i;
				w[ans]=t*j;
				mp[i][j]-=t;
				t<<=1;
			}
			if(mp[i][j]){
				ans+=1;
				v[ans]=mp[i][j]*i;
				w[ans]=mp[i][j]*j;
			}
		}
	}
	for(int i=1;i<=ans;i++)
	    for(int j=m;j>=v[i];j--)
	        f[j]=max(f[j],f[j-v[i]]+w[i]);
	cout<<f[m];
    return 0;
}