辅助函数 母函数的分析以及应用

母函数的理解见解了好多大佬的博客,自己都还是不明白,然后又反复去看,终于明白了许多,现在讲讲我对它的理解吧。


首先我们用一个经典的例子来解释什么是母函数吧。

给定你重量为1的砝码,重量为2的砝码,重量为3的砝码各一个,求组成对应重量的不同组合法。


我们用X ^0来表示我们不取这个砝码,用X^m来表示我们取重量为m的砝码,即两种状态。


那么上述问题便可以写成(1+x^1)(1+x^2)(1+x^3)   

把括号合并后结果为 1+x^1+x^2+2*x^3+x^4+x^5+x^6

那么就可以得到分成对应的方案数拉,就是前面的系数,比如6为1种方案 可分解为 1+2+3,3为2种方案,可分解为1+2,3

相信到这里,大家应该猜测到母函数的大概形式了,上述问题就是母函数形式,所以我们只要求前面的系数,是不是问题就解决了呢,至于如何求,请看下面。

普通型母函数的表达式为:

           G(X)=a0+a1X+a2X^2+a3X^3+a4X^4+~~~~+’anX^n.

那么接下来我就讲一下如何求这个系数呢?

首先我们要对问题分析,他是怎么样的一个母函数形式,

比如 如果 砝码无限多的话

那么G(x)=(1+x^1+x^2+~~~+x^n)(1+x^2+x^4+x^6+~~~+x^n2)(1+x^3+x^6+~~~+x^n3)

确立好母函数形式了之后,我们的想法是模拟从第一个括号乘到最后一个,中间结果给C2,最终的给C1.

所以我们可以定义两个数组,一个C1用来最终存储结果,C2来存储中间结果.这里有个标准的模板,上代码分析吧!


#include
#include
#include
#include
#include
#define INF 100000000
using namespace std;
int c1[305],c2[305];
int main(){
    int n;
    while(~scanf("%d",&n)&&n){
       memset(c1,0,sizeof(c1));         //这里是初始化C1,很重要,小编就是因为这个地方觉得不要也行,然后好几个题WA,所以以后有数组,直接初始化。
       for(int t=0;t<=n;t++){
                    c1[t]=1;                        //这个循环是初始化第一个括号,因为我们后面的计算要建立在前面的基础上,以为乘得有个开始,不能以0为起点吧!等于
                                                              1是因为第一个括号的所有数都是系数为1的。,n的值就为第一个所选的重量。
                }
            for(int j=1;j                     memset(c2,0,sizeof(c2));  //因为C2用来放中间值,必须置0。
                    for(int z=0;z<=n;z++)         //这个循环表示的是所有价值的可能,也就是前面j个括号算出来的结果吧,反正起始位置一般是0,终止位置是题目要求的重量
或者价值。             
                    for(int k=0;k<=n&&k+z<=n;k++
)      //这个循环是表示第j个括号的第k项对应的价值,因为要乘这个括号嘛,当然要抓出每一项。
                    c2[k+z]+=c1[z];                         //这里就是把前面的价值和当前括号加起来,k+z为当前价值,c1[z]为前面的.
             for(int i=0;i<=n;i++){
                c1[i]=c2[i];                                    //   这里我们要把计算前j次的值都要给C1,那么括号算完后,结果就出来了。
             }

            }
           printf("%d\n",c1[n]);                           //结果为c1[n],n为题目的要求.
        }

return 0;}


其实觉得这个模板套起来很方便,但是大家还是得懂得什么时候要用这个母函数啊。
个人认为在需要把某M,分成由各个不同东西组成的时候,就可以用这个拉!当然还有更多变换,要大家去好好学习!
以上就是我对母函数的所有了解,希望有啥不对的地方,大家给指正,谢谢!

希望对大家有帮助!




你可能感兴趣的:(函数模板)