HDU ACM 1284 钱币兑换问题

题目描述如下:

钱币兑换问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Problem Description
在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法。请你编程序计算出共有多少种兑法。
 
Input
每行只有一个正整数N,N小于32768。
 
Output
对应每个输入,输出兑换方法数。
 
Sample Input
2934 12553
 
Sample Output
718831 13137761
 
Author
SmallBeer(CML)
 
解题思路:
  开始时,用暴力方法求解,发现时间太长,然后看了别人的评论,可以改变一下算法,不用多重循环,只用一重循环就可以了。
可以先确定3分钱的数量,假如为N3,(2分钱的数量为N2,1分钱的数量为N1)则,N-3*N3=2*N2+N1;因为,一但3分钱的数量确定了,只剩下1分钱和2分钱的数量,而2分钱的数量和1分钱的数量是一一对应的,所以可有如下代码:
(C语言版)
  #include<stdio.h>
int main()
{
 int i,j,k,ni,nj,nk;
 int n,flag;
 __int64 sum;
 while(scanf("%d",&n)==1)
 {
  sum=0;
  ni=n/3;
  for(i=0;i<=ni;i++)
  {
   sum=sum+((n-3*i)/2+1);
  }
  printf("%I64d\n",sum);
 }
 return 0;
}
 
只要坚持不懈,没有什么事情是做不到的!
                                                                                      Never Give Up !
就算天再高,那又怎样,踮起脚尖,就可以更靠近阳光!
原文地址:https://www.cnblogs.com/dreamapple/p/3092577.html