166

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <iomanip>
#include <fstream>

#define INF 10000000
using namespace std;

int availabe_coin[6];
int min_ways[1005];
int visit[6];
int coins[6]={5,10,20,50,100,200};
int cost;
int cmp;

void dp(int tcost,int index,int noOfsteps)
{
	int tmp,v;
	if(tcost>=cost)
	{
		int d = tcost-cost;
		if(d>1003)
		return;
		if(min_ways[d]!=INF)
		{
			tmp = noOfsteps+min_ways[tcost-cost];
			if(tmp<cmp)
			{
				cmp = tmp;
				return;
			}
		}
	}
	for(int i=index+1;i<6;i++)
	{
		if(availabe_coin[i]==0)
		continue;
		if(visit[i]==0)
		{
			visit[i]=1;
			v = availabe_coin[i];
			for(int j=1;j<=v;j++)
			{
				availabe_coin[i]-=j;
				dp(tcost+j*coins[i],i,noOfsteps+j);
				availabe_coin[i]+=j;
			}
			visit[i]=0;
		}
	}
}

int main()
{
	int total,v,p,q;
	for(int i=0;i<1005;i++)
		min_ways[i]=INF;

	min_ways[0]=0;

	for(int i=0;i<6;i++)
	{
		for(int j=coins[i];j<1005;j++)
		{
			min_ways[j]= min(min_ways[j],1+min_ways[j-coins[i]]);
		}
	}
	while(scanf("%d",&availabe_coin[0]))
	{
		visit[0]=0;
		total = availabe_coin[0];
		for(int i=1;i<=5;i++)
		{
			scanf("%d",&availabe_coin[i]);
			visit[i]=0;
			total += availabe_coin[i];
		}
		if(total==0)
		break;

		scanf("%d.%d",&p,&q);
		cost=q+p*100;
		cmp = INF;
		for(int i=0;i<6;i++)
		{
			if(availabe_coin[i]==0)
			continue;
			if(visit[i]==0)
			{
				visit[i]=1;
				v = availabe_coin[i];
				for(int j=1;j<=v;j++)
				{
					availabe_coin[i]-=j;
					dp(0+j*coins[i],i,0+j);
					availabe_coin[i]+=j;
				}
				visit[i]=0;
			}
		}
		cout<<setw(3)<<cmp<<"\n";
	}

	return 0;
}

 

Leave a Reply

Your email address will not be published. Required fields are marked *