Problem Description
在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法。请你编程序计算出共有多少种兑法。
Input
每行只有一个正整数N,N小于32768。
Output
对应每个输入,输出兑换方法数。
Sample Input
2934
12553
Sample Output
718831
13137761
什么是母函数?
假设1分、3分、5分每一种硬币各一枚,可以得到:
(1+x)*(1+x^3)*(1+x^5)=1+x+x^3+x^4+x^5+x^6+x^8+x^9
展开之后表示可以组成面值为1、3、4、5、6、8、9的方法各一种
如果各两枚的话,可以得到:
(1+x+x^2)*(1+x^3+x^6)*(1+x^5+x^10)
同理,如果各三枚的话,可以得到:
(1+x+x^2+x^3)*(1+x^3+x^6+x^9)*(1+x^5+x^10+x^15)
因此开两重循环,外面一层遍历硬币种数,里面一层遍历每种硬币的个数,用一个数组记录下每种面值的方法数。
#include <cstring>
#include <cstdlib>
#include <cstdio>
using namespace std;
const int Max=32769;
int ans[Max],tans[Max];
int main()
{
int i,j,n;
for(int i=0;i<Max;i++)
ans[i]=1;
memset(tans,0,sizeof(tans));
for(int k=2;k<=3;k++)
{
for(i=0;i<Max;i++)
for(j=0;i+j<Max;j+=k)
tans[i+j]+=ans[i];
for(i=0;i<Max;i++)
{
ans[i]=tans[i];
tans[i]=0;
}
}
while(scanf("%d",&n)!=EOF)
printf("%d\n",ans[n]);
return 0;
}