母函数模板
这好像第三次巩固母函数了,第一次没理解思想,第二次理解了,但不知变通,这次总算是弄得挺清楚了。这里写一个模板吧!以及个人对母函数的理解
下面以整数划分数的数量为例写的一个模板。
#include<stdio.h> #include<string.h> int c1max],c2[max];
//c1保存整数课划分的数目
//c2是中间量,保存每一次的情况 int main() { int n,i,j,k; while(scanf("%d",&n)!=EOF) { for(i=0;i<=n;i++)//首先对c1初始化,由第一个表达式(1+x+x^2+..x^n)初始化,把质量从0到n的所有砝码都初始化为1. c1[i]=1;
memset(c2,0,sizeof(c2));//最好对c2的赋值为0,如果没有这一步,可能在一些题目中会出错 for(i=2;i<=n;i++)// i从2到n遍历,这里i就是指第i个表达式,上面给出的第二种母函数关系式里,每一个括号括起来的就是一个表达式。 { for(j=0;j<=n;j++)//j 从0到n遍历,这里j就是(前面i個表达式累乘的表达式)里第j个变量,如(1+x)(1+x^2)(1+x^3),j先指示的是1和x的指数,i=2执行 //完之后变为(1+x+x^2+x^3)(1+x^3),这时候j应该指示的是合并后的第一个括号的四个变量的指数。 for(k=0;k+j<=n;k+=i)//k指的是与那个表达式相乘的的那个表达式的指数。 c2[k+j]+=c1[j];//将指数相同的系数合并。 for(j=0;j<=n;j++) { c1[j]=c2[j]; c2[j]=0; } } printf("%d\n",c1[n]); } return 0; }