钱币兑换问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7261 Accepted Submission(s): 4265
Problem Description
在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法。请你编程序计算出共有多少种兑法。
Input
每行只有一个正整数N,N小于32768。
Output
对应每个输入,输出兑换方法数。
Sample Input
2934 12553
Sample Output
718831 13137761
Author
SmallBeer(CML)
Source
Recommend
这题可以采用母函数或者递推或者其他规律。
设d[i][j]为前i个硬币可以兑换j的兑法,考虑第i个,要么不取,兑法就为d[i-1][j],要么取,兑法就为d[i-1][j-v[i]];v[i]==i;
d[i][j]就等于这两种情况之和.(每种硬币的取还是不取的选择,从结果来看,能够包含兑换成j的硬币序列组合,就是说决策能够包含了所以可能的结果)。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; long long d[42768]; void init() { memset(d,0,sizeof(d)); } int main() { int n; while(~scanf("%d",&n)) { init(); if(n==0) { printf("0 "); continue; } if(n==1) { printf("1 "); continue; } d[0]=1; for(int i=1;i<=3;i++) for(int j=i;j<=n;j++) { d[j]=d[j]+d[j-i]; } printf("%lld ",d[n]); } return 0; }