【題】
郵票組合(選作)
背景:
我們寄信都要貼郵票,在郵局有一些小面值的郵票,通過這些小面值郵票中的一張或幾張的組合,可以滿足不同郵件的不同的郵資。
現在,郵局有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分也可以。顯然不同郵票的組合都可以得到同樣一種郵資。
#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;
}