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;
}
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 !
就算天再高,那又怎样,踮起脚尖,就可以更靠近阳光!