钱币兑换问题
原题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 13376 Accepted Submission(s): 8071
Problem Description
在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法。请你编程序计算出共有多少种兑法。
Input
每行只有一个正整数N,N小于32768。
Output
对应每个输入,输出兑换方法数。
Sample Input
2934
12553
Sample Output
718831
13137761
问题描述
计算出共有多少种兑法
问题分析
兑换方法就是共有x分钱,可以变成a个1分钱加上b个2分钱加上c个3分钱,即x=1a+2b+3c,使(a,b,c)发生变化,就是不同的方法。做法:先设3分钱的个数c,那么剩余的钱为x-3c;再设2分钱的个数为b,剩余的钱为x-3c-2b,同时这也是1分钱的个数a;因为题目只要求不同的兑法,不要求把个数分别计算处理,所以思路进行到这就可以了。在循环里再添加一个循环就可以实现了。注意:为减少程序运行的时间,需要减少循环进行的次数,也就是不要用1分钱每次加1做循环,因为那样有时循环次数真的太多了。
c++程序如下
#include<iostream>
using namespace std;
int main()
{
int kind;
int n, i, j, surplus;
while (cin >> n)
{
for (kind = i = 0; i <= n; i+=3)//先取3,2可以减少循环的次数
{
surplus = n - i;//取3分后剩余的钱
for (j = 0; j <= surplus; j += 2)
{
kind++;//任意情况都是
}
}
cout << kind << endl;
}
return 0;
}