记录编号 47571 评测结果 AAAAAAAAAA
题目名称 硬币问题 最终得分 100
用户昵称 GravatarTruth.Cirno 是否通过 通过
代码语言 C++ 运行时间 0.268 s
提交时间 2012-11-02 07:48:10 内存使用 4.40 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <memory.h>
using namespace std;

int a[110],minused[110],maxused[110],get[100010],rec[100010],which[100010];
bool f[100010];

void findway(int i,int* used)
{
	while (i)
	{
		used[which[i]]++;
		i-=rec[i];
	}
}

int main(void)
{
	freopen("kouka.in","r",stdin);
	freopen("kouka.out","w",stdout);
	int i,j,n,s,minget,maxget;
	cin>>n>>s;
	for (i=1;i<=n;i++)
		cin>>a[i];
	f[0]=true;
	get[0]=0;
	for (i=1;i<=s;i++)
	{
		for (j=1;j<=n;j++)
		{
			if (i-a[j]<0)
				continue;
			if (f[i-a[j]])
			{
				if (!f[i])
				{
					f[i]=true;
					get[i]=get[i-a[j]]+1;
					rec[i]=a[j];
					which[i]=j;
				}
				else
				{
					if (get[i]>get[i-a[j]]+1)
					{
						get[i]=get[i-a[j]]+1;
						rec[i]=a[j];
						which[i]=j;
					}
				}
			}
		}
	}
	if (!f[s])
	{
		cout<<"-1\n";
		return(0);
	}
	minget=get[s];
	findway(s,minused);
	memset(f,0,sizeof(f));
	memset(get,0,sizeof(get));
	f[0]=true;
	get[0]=0;
	for (i=1;i<=s;i++)
	{
		for (j=1;j<=n;j++)
		{
			if (i-a[j]<0)
				continue;
			if (f[i-a[j]])
			{
				if (!f[i])
				{
					f[i]=true;
					get[i]=get[i-a[j]]+1;
					rec[i]=a[j];
					which[i]=j;
				}
				else
				{
					if (get[i]<get[i-a[j]]+1)
					{
						get[i]=get[i-a[j]]+1;
						rec[i]=a[j];
						which[i]=j;
					}
				}
			}
		}
	}
	maxget=get[s];
	findway(s,maxused);
	cout<<minget<<' '<<maxget<<endl;
	s=0;
	for (i=1;i<=n;i++)
		while (minused[i])
		{
			minused[i]--;
			if (s)
			{
				cout<<' '<<i;
			}
			else
			{
				s=1;
				cout<<i;
			}
		}
	cout<<endl;
	s=0;
	for (i=1;i<=n;i++)
		while (maxused[i])
		{
			maxused[i]--;
			if (s)
			{
				cout<<' '<<i;
			}
			else
			{
				s=1;
				cout<<i;
			}
		}
	cout<<endl;
	return(0);
}