**
HDU-1284 钱币兑换问题
**
问题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1284
问题描述:
在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法。请你编程序计算出共有多少种兑法。
Input
每行只有一个正整数N,N小于32768。
Output
对应每个输入,输出兑换方法数。
Sample Input
2934
12553
Sample Output
718831
13137761
问题分析:
看到此题第一眼的想法就是用暴力法来写,运用两到三个for循环来解决问题,但很明显这样的做法肯定会超时,如何让代码更加精简,并减少运行时间才是重点。因为一枚两分硬币可以拆成两枚一分硬币,所以可以先讨论三分硬币的个数,然后一枚两分硬币拆成两枚一分硬币是一个新的组合,那么有多少个两分硬币就有多少种新的组合。这里要注意的是这里只有币值的区分,不用考虑顺序问题,和两分硬币没有分开前是一中组合。
程序如下:
#include<stdio.h>
int main(void)
{
int n, s;
int i, k;
while (scanf("%d", &n) == 1)
{
s = 0;
k = n / 3;//k是三分硬币的个数
for (i = 0; i <= k; i++)
{
s = s + (n - i * 3) / 2 + 1;//加一是因为所有两分硬币都没有分开时是一种组合
}
printf("%d\n", s);
}
return 0;
}