【这篇不含代码】为什么会有母函数?母函数漫谈及其解题的思路。

今天看了下母函数,不太懂。再看,似乎微懂了点。首先,他们的题都是差不多的,求种类、求方案数,几分硬币有几个之类的。       

首先要知道,母函数是用来求种类的,它巧妙的运用了多项式展开的法则,本质就是多项式的乘法。

首先,抛出一般的情况,从具有实用性的(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;
}

   

你可能感兴趣的:(【这篇不含代码】为什么会有母函数?母函数漫谈及其解题的思路。)