數組-排序-郵票組合

【題】

郵票組合(選作)


背景:
        我們寄信都要貼郵票,在郵局有一些小面值的郵票,通過這些小面值郵票中的一張或幾張的組合,可以滿足不同郵件的不同的郵資。
        現在,郵局有4種不同面值的郵票。在每個信封上最多能貼5張郵票,面值可相同,可不同。

輸入:
        四種郵票的面值。

輸出:
        用這四種面值組成的郵資最大的從1開始的一個連續的區間。

說明:
        如結果爲10,則表明使用4張郵票可組合出1、2、3、4、5、6、7、8、9、10這些郵資。

名詞解釋:
        郵資:就是你寄東西需要花多少錢。
        郵票面額:是由國家發行的具有固定價格的花紙片,被稱爲郵票。

如果你寄東西,郵局稱了重量,告訴你要240分。這樣你就要貼郵票了。如果現在郵局的郵票有面值爲80分、50分、20分和10分的四種,你就可以採用不同的組合得到240的郵資,例如:採用3張80分的可以湊出240分;或者24張10分的湊起來240分也可以。顯然不同郵票的組合都可以得到同樣一種郵資。

  測試輸入關於“測試輸入”的幫助 期待的輸出關於“期待的輸出”的幫助 時間限制關於“時間限制”的幫助 內存限制關於“內存限制”的幫助 額外進程關於“{$a} 個額外進程”的幫助
測試用例 2 以文本方式顯示
  1. 1 3 7 12↵
以文本方式顯示
  1. The max is 46.↵
1秒 64M
0
【分析】
(1)首先要找出四種郵票組合出的不同的面值,用數組存起來。
(2)然後,找出從1開始的一個連續的區間。怎麼找呢?對面值進行從小到大排序。這樣就能很明顯得發現,哪裏不連續了。

【代碼】

#include "stdio.h"

int main(int argc, char **argv)
{
	int i, j, k, r, t;
	int a=1, b=3, c=7, d=12;

	int sum, arr[10000], count = 0, flag;		//保存數的各個位
	
	arr[0] = 0;

	scanf("%d %d %d %d", &a, &b, &c, &d);
	getchar();

	//找出所有不同是組合
	for (i = 0; i <= 5; i++)
	{
		for (j = 0; j <= 5; j++)
		{
			for (k = 0; k <= 5; k++)
			{
				for (r = 0; r <= 5; r++)
				{
					if (i + j + k + r > 5)	//郵票一共最多5張
					{
						continue;
					}

					sum = a * i + b * j + c * k + d * r;   //組合出的郵票面值
					flag = 0;
					
					for (t = 0; t <= count; t++)	  //檢查這種面值是否出現過。其實這一步可以省略掉,然後在找連續區間時進行適當的處理也行		
					{
						if (sum == arr[t])
						{
							flag = 1;
							break;
						}
					}
					if (!flag)
					{
						count++;
						arr[count] = sum;						
					}
				}
			}
		}
	}

	printf("\n組合出的所有不同的郵票面值:\n");
 	for (i = 1; i <= count; i++)
	{
 		printf("%4d", arr[i]);
		if (i % 10 == 0)
		    printf("\n");
	}
	int temp;
	//冒泡排序,產生連續的值
	for (i = 1; i <= count; i++)
	{
		for (j = count; j > i; j--)
		{
			if (arr[j] < arr[j-1])
			{
				temp = arr[j];
				arr[j] = arr[j-1];
				arr[j-1] = temp;
			}
		}
	}

	printf("\n\n排序後的所有不同的郵票面值:\n");
	for (i = 1; i <= count; i++)
	{
		printf("%4d", arr[i]);
		if (i % 10 == 0)
			printf("\n");
	}	
	printf("\n");

	//找出從1開始的連續區間
	for (i = 1; i <= count; i++)
	{
		if (arr[i] != i)
		{
			break;
		}
	}
	printf("The max is %d.\n", i-1);
	return 0;
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章