您的位置:首页 > 其它

数组-排序-邮票组合

2012-11-11 09:22 120 查看
【题】


邮票组合(选作)

背景:

我们寄信都要贴邮票,在邮局有一些小面值的邮票,通过这些小面值邮票中的一张或几张的组合,可以满足不同邮件的不同的邮资。

现在,邮局有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分也可以。显然不同邮票的组合都可以得到同样一种邮资。

测试输入

期待的输出

时间限制

内存限制

额外进程

测试用例 2以文本方式显示

1 3 7 12↵

以文本方式显示

The max is 46.↵

1秒64M0
【分析】
(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: