今天看了下母函数,不太懂。再看,似乎微懂了点。首先,他们的题都是差不多的,求种类、求方案数,几分硬币有几个之类的。
首先要知道,母函数是用来求种类的,它巧妙的运用了多项式展开的法则,本质就是多项式的乘法。
首先,抛出一般的情况,从具有实用性的(1+x)^n开始看,它的展开式,恰巧就是c(n,1)x+c(n,2)x^2+……+c(n,n)x^n,系数便代表了方案数。事情就是这么简单。这一串公式的展开式所组成的G(X)就是母函数。
官方定义:(灰常麻烦)(1+x)n是序列C(n,0),C(n,1),...,C(n,n)的母函数。 如若已知序列a0,a1,a2,…则对应的母函数G(x)便可根据定义给出。反之,如若已经求得序列的母函数G(x),则该序列也随之确定。 序列a0,a1,a2,…可记为{an} 。
举例说明。举例的对象一般是砝码君,小球君,硬币君等能够拆成不同质量或等级的,可以用来自由组合的东西。
比如1个1分,1个2分,1个3分,1个4分,可以表示为1+x,1+x^2,1+x^3,1+x^4。他们一乘,即得方案。不同项前的系数即为组成N克的方案数。官方定义叫拆分数。
整数拆分成若干整数的和,办法不一,不同拆分法的总数叫做拆分数。
下边按自己理解写两个练习,不知道对不对。。。。。不对的请速度评论,我好改。。。
例:若有1克砝码3枚、2克砝码4枚、4克砝码2枚,问能称出哪几种重量?各有几种方案? 答:原始式子得(1+x+x^2+x^3)(1+x^2+x^4+x^6+x^8)(1+x^4+x^8),展开既得结果。。
例:整数n拆分成1,2,3,…,m的和,求其母函数。f(x)=(1/1-x)*(1/1-x^2)*……=1/(1-x)(1-x^2)(1-x^3)…(1-x^m),如果没错的话应该是这样,虽然我数学很差ORZ。
例:如若上例中m至少出现一次,其母函数又如何?这个我看了很久,最终得出答案是上边那个结果再减1/(1-x)(1-x^2)(1-x^3)…(1-x^m-1)多减了个(1-x^(m-1))的分母吧……
结论感悟不知道,反正能求种类数……= =
编程方法和难点就是展开多项式了,正在速度观察中……以上为纯数学部分,有理解失误请一定及时指出。。。
附伪代码一个,依然是个人理解感觉自己数学学得真差,MD。。。。:
#include <iostream> using namespace std; int 很大的数组1,很大的数组2; int main(){ while (cin>>n) { 初始化c1为1; for (i=2;i<=n;i++) { for (j=0;j<=n;j++) for (k=0;k+j<=n;k+=i)//目前不明这句 { c2[j+k]+=c1[j]; } for (j=0;j<=n;j++) { c1[j]=c2[j]; c2[j]=0; } } cout<<c1[n]<<endl; } return 0; }