比赛 15级练手赛 评测结果 AAAAAAAAAA
题目名称 采药(加强版) 最终得分 100
用户昵称 瑆の時間~無盡輪迴·林蔭 运行时间 3.166 s
代码语言 C++ 内存使用 5.52 MiB
提交时间 2018-08-28 20:11:22
显示代码纯文本
#include<iostream>
#include<cstdio>
using namespace std;
int yp[21][21];//体积・价值
int v[250001];
int w[250001];
int dp[3][40001];
int main()
{
	freopen("crazytime.in","r",stdin);
	freopen("crazytime.out","w",stdout);
	int n,m;
	cin>>n>>m;
	int a,b;
	for(int i=1;i<=20;i++)
	{
		for(int j=1;j<=20;j++)
		{
			yp[i][j]=0;
		}
	}
	int maxa=0;
	int maxb=0;
	for(int i=1;i<=n;i++)
	{
		cin>>a>>b;
		yp[a][b]++;
		maxa=max(maxa,a);
		maxb=max(maxb,b);
	}
	int s=0;
	int jl=1;
	for(int i=1;i<=maxa;i++)
	{
		for(int j=1;j<=maxb;j++)
		{
			if(yp[i][j]>0)
			{
				int u=1;
				for(;;)
				{
					
					if(yp[i][j]>=u)
					{
						v[jl]=i*u;
						w[jl]=j*u;
						yp[i][j]=yp[i][j]-u;
						jl++;
						u<<=1;
					}
					else
					{
						if(yp[i][j]>0)
						{
						v[jl]=i*yp[i][j];
						w[jl]=j*yp[i][j];
						jl++;
						}
						break;
					}
				}
			}
		}
	}
	jl--;
	for(int i=0;i<=40000;i++)
	{
		for(int j=0;j<=2;j++)
		{
			dp[j][i]=0;
		}
	}
	int se=0;
	for(int i=1;i<=jl;i++)
	{
		se=1-se;
		for(int j=m;j>=0;j--)
		{
			if(j>=v[i])
			{
				dp[se][j]=max(dp[1-se][j],dp[1-se][j-v[i]]+w[i]);
			}
			else
				dp[se][j]=dp[1-se][j];
		}
	}
	cout<<dp[se][m];
	return 0;
}