母函数的第一道例题,可采用模版。
整理模版:
#include <iostream> using namespace std; const int lmax=10000; int c1[lmax+1],c2[lmax+1]; int main() { int n,i,j,k; while (cin>>n) { for (i=0;i<=n;i++)//c1保存第1个括号,c2总是保存一趟 运算的结果(每一对括号合并成一个括号) {c1[i]=0; c2[i]=0; }//初始化 for (i=0;i<=n;i++) c1[i]=1;//此题c1初始化为1,前面的c1初始化是为了其它题目做模版 for (i=2;i<=n;i++)//n个括号要进行n-1趟运算 { for (j=0;j<=n;j++)//j是第一个括号的指数 for (k=0;k+j<=n;k+=i)//k是第二个括号的指数 { c2[j+k]+=c1[j]; }//第二个括号的系数都是1,隐含了c2[j+k]+=c1[j]*1; for (j=0;j<=n;j++) { c1[j]=c2[j]; c2[j]=0; }//c1保存第1个括号,要保存成前一趟运算的结果 } cout<<c1[n]<<endl; } return 0; }
AC代码:
//1398 15:31 #include<iostream> using namespace std; const int Imax=300; int c1[Imax+1],c2[Imax+1]; int main() { int n,i,j,k; while(cin>>n&&n!=0){ for(i=0;i<=n;i++){//c1保存第1个括号,c2总是保存一趟运算的结果(每一对括号合并成一个括号) c1[i]=1; c2[i]=0; } for(i=2;i<=17;i++){//n个括号要进行n-1趟运算 for(j=0;j<=n;j++)//j是第一个括号的指数 for(k=0;k+j<=n;k+=i*i){//k是第二个括号的指数 c2[j+k]+=c1[j];//第二个括号的系数都是1,隐含了c2[j+k]+=c1[j]*1; } for(j=0;j<=n;j++){//c1保存第1个括号,即要保存成前一趟运算的结果 c1[j]=c2[j]; c2[j]=0; } } cout<<c1[n]<<endl; } return 0; }