比赛 15级练手赛 评测结果 AAAAAAAAAA
题目名称 采药(加强版) 最终得分 100
用户昵称 Peter_Matthew 运行时间 2.724 s
代码语言 C++ 内存使用 8.88 MiB
提交时间 2018-08-28 20:37:43
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int cc[250250],vv[250250],ww[250250],ccnt,cnt;
int v[250250],w[250250];
int dp[250250];
int n,W,s1,s2;
int main()
{
	freopen("crazytime.in","r",stdin);
	freopen("crazytime.out","w",stdout);
	scanf("%d%d",&n,&W);
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",&s1,&s2);
		bool flag=true;
		for(int i=1;i<=ccnt;i++)
		{
			if(vv[i]==s1&&ww[i]==s2)
			{
				++cc[i],flag=false;
				break;
			}
		}
		if(flag)
		{
			++ccnt;
			vv[ccnt]=s1,ww[ccnt]=s2;
			cc[ccnt]=1;
		}
	}
	for(int i=1;i<=ccnt;i++)
	{
		int t=1;
		while(cc[i]>=t)
		{
			++cnt;
			v[cnt]=vv[i]*t;
			w[cnt]=ww[i]*t;
			cc[i]-=t;
			t*=2;
		}
		++cnt;
		v[cnt]=cc[i]*vv[i];
		w[cnt]=cc[i]*ww[i];
	}
	for(int i=1;i<=cnt;i++)
	{
		for(int j=W;j>=v[i];j--)
		{
			dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
		}
	}
	printf("%d",dp[W]);
	return 0;
}