您的位置:首页 > 其它

高级程序设计语言2的作业有点难

2007-03-18 00:32 253 查看
今天写了第一次作业的最后3道答题,全是算法,纯算法!无聊~~~

其中最后一题是这样的:

兑换硬币

【问题描述】

写一个程序,从标准输入上读入一个正整数N(1 <= N <=1000),计算出N元人民币兑换成1分、2分和5分的硬币,有多少种可能的组合。将结果以整数的方式输出到标准输出上,占一行。

时间限制:1秒。

【输入样例】

1

【输出样例】

541

在网上找到了相关资料...

以6分硬币为例分析如下
[情况1] 如果不用5分的硬币,则共有6/2+1种组合方法,这是因为:如果都用1分的硬币,只有1种方法,这就是公式n/2+1后面要加1的缘故;而如果用上2分的硬币,可能用1个二分硬币,或者2个二分硬币,或者3个硬币,即最多可以有6/2个二分硬币。因此如果不用五分硬币,就共有6/2+1种组合方法。

[推广1] 这可以推广到n分硬币的情况,在不用5分硬币的情况,就可以有n/2+1种组合方法。

[情况2] 如果用五分硬币,如果用1个五分硬币,则将(6-5)分硬币按照情况1,即只有一分硬币和二分硬币,进行组合,组合的方法有(6-5)/2+1种。因为在此例中,最多只能用1个五分硬币,所以总共的组合方法就是((6-5)/2+1)+ 6/2+1=5种。

[推广2] 情况2推广到n分硬币的情况,如果只用1个五分硬币,将n-5分硬币按照情况1进行组合,方法有(n-5)/2+1种;如果用2个五分硬币,方法有(n-5*2)/2+1种;如果用3个五分硬币,方法有(n-5*3)/2+1种…...因此,用上了五分硬币的情况总共有种。

[综上] 有公式( ( n - 5 * i ) / 2 ) + 1求和(i从0到n/5)

代码如下:


#include<stdio.h>




int main()




...{


int n = 0, i = 0, times = 0;


scanf( "%d", &n );


for ( i = 0; i <= n / 5; i++ )


times += ( ( n - 5 * i ) / 2 ) + 1;


printf( "%d ", times );


}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: