初级硬币问题

已知,有一批不同面值的硬币,没有硬币个数限制,求得到S的所有组合,以及最小,最大硬币个数。

最小、最大硬币个数可以用贪心法,但是不一定能够得到有效解,但是可以提高结题速度,此处略。

下面的解法比求解最大、最小硬币比较耗时。

static int* set;



static int  Min = 1<<10;

static  int Max = 0;



void LeastCoin(int* Value, int Len, int Goal, int cur) 

{

	if(Goal == 0) 

	{

		for(int i = 0; i < cur; i++)

		{

			printf("%d ", set[i]);

		}

		if(cur > Max)

		{

			Max = cur;

		}

		if(Min > cur)

		{

			Min = cur;

		}

		printf("\n");

	}

	else

	{

		for(int i = 0; i < Len; i++)

		{

			

			if(Goal >= Value[i])

			{

				int ok = 1;

				for(int j = 0; j < cur; j++)

				{

					if(set[j] > Value[i])

					{

						ok = 0;

						break;

					}				

				}

				if(ok)

				{				

				   set[cur] = Value[i]; 

				   LeastCoin(Value, Len, Goal - Value[i], cur + 1); 				

				}

			}		



		}

		

	}



}



void WLeastCoin(int* Value, int Len, int Goal)  

{



	printf("goal: %d\n", Goal);

	set = new int [Len];

	memset(set, 0 , sizeof(int)*Len);

	int cur = 0;

	LeastCoin(Value, Len, Goal,  cur);

	printf("Max:%d \n", Max);

	printf("Min:%d \n", Min);



}

  

你可能感兴趣的:(问题)