zoukankan      html  css  js  c++  java
  • 母函数 详解

    转自      Tanky Woo

    母函数(Generating function)详解

    前段时间写了一篇《背包之01背包、完全背包、多重背包详解》,看到支持的人很多,我不是大牛,只是一个和大家一样学习的人,写这些文章的目的只是为了一是希望让大家学的轻松,二是让自己复习起来更方便。

    (PS:大家觉得我的文章还过的去就帮我支持下我的个人独立博客---Tanky Woo的程序人生:http://www.wutianqi.com/,谢谢)

    (以下内容部分引至杭电ACM课件和维基百科)


    在数学中,某个序列的母函数是一种形式幂级数,其每一项的系数可以提供关于这个序列的信息。使用母函数解决问题的方法称为母函数方法

    母函数可分为很多种,包括普通母函数指数母函数L级数贝尔级数狄利克雷级数。对每个序列都可以写出以上每个类型的一个母函数。构造母函数的目的一般是为了解决某个特定的问题,因此选用何种母函数视乎序列本身的特性和问题的类型。


    这里先给出两句话,不懂的可以等看完这篇文章再回过头来看:

    "把组合问题的加法法则和幂级数的t的乘幂的相加对应起来"

    "母函数的思想很简单—就是把离散数列和幂级数一一对应起来,把离散数列间的相互结合关系对应成为幂级数间的运算关系,最后由幂级数形式来确定离散数列的构造. "


    我们首先来看下这个多项式乘法:

     

    由此可以看出:

    1. x的系数是a1,a2,…an的单个组合的全体。

    2. x2的系数是a1,a2,…a2的两个组合的全体。

    ………

    n. xn的系数是a1,a2,….an的n个组合的全体(只有1个)。

    由此得到:

     

    母函数的定义:

    对于序列a0,a1,a2,…构造一函数:

      

    称函数G(x)是序列a0,a1,a2,…的母函数


    这里先给出2个例子,等会再结合题目分析:

    第一种:

    有1克、2克、3克、4克的砝码各一枚,能称出哪几种重量?每种重量各有几种可能方案? 

    考虑用母函数来接吻这个问题:

    我们假设x表示砝码,x的指数表示砝码的重量,这样:

    1个1克的砝码可以用函数1+x表示,

    1个2克的砝码可以用函数1+x2表示,

    1个3克的砝码可以用函数1+x3表示,

    1个4克的砝码可以用函数1+x4表示,

    上面这四个式子懂吗?

    我们拿1+x2来说,前面已经说过,x表示砝码,x的指数表示重量,即这里就是一个质量为2的砝码,那么前面的1表示什么?1代表重量为2的砝码数量为0个。(理解!)

    不知道大家理解没,我们这里结合前面那句话:

    "把组合问题的加法法则和幂级数的t的乘幂的相加对应起来"


    1+x2表示了两种情况:1表示质量为2的砝码取0个的情况,x2表示质量为2的砝码取1个的情况。

    这里说下各项系数的意义:

    在x前面的系数a表示相应质量的砝码取a个,而1就表示相应砝码取0个,这里可不能简单的认为相应砝码取0个就该是0*x2(想下为何?结合数学式子)。

    Tanky Woo 的程序人生http://www.wutianqi.com/


    所以,前面说的那句话的意义大家可以理解了吧?

    几种砝码的组合可以称重的情况,可以用以上几个函数的乘积表示:

    (1+x)(1+x2)(1+x3)(1+x4)

    =(1+x+x2+x3)(1+x3+x4+x7)

    =1+x+x2+2x3+2x4+2x5+2x6+2x7+x8+x9+x10 

    从上面的函数知道:可称出从1克到10克,系数便是方案数。(!!!经典!!!)

        例如右端有2x5 项,即称出5克的方案有2:5=3+2=4+1;同样,6=1+2+3=4+2;10=1+2+3+4。

        故称出6克的方案有2,称出10克的方案有1 。


    接着上面,接下来是第二种情况:

    求用1分、2分、3分的邮票贴出不同数值的方案数:

    大家把这种情况和第一种比较有何区别?第一种每种是一个,而这里每种是无限的。

     

    以展开后的x4为例,其系数为4,即4拆分成1、2、3之和的拆分数为4;

    即 :4=1+1+1+1=1+1+2=1+3=2+2

    这里再引出两个概念整数拆分和拆分数:

    所谓整数拆分即把整数分解成若干整数的和(相当于把n个无区别的球放到n个无标志的盒子,盒子允许空,也允许放多于一个球)。

    整数拆分成若干整数的和,办法不一,不同拆分法的总数叫做拆分数


    现在以上面的第二种情况每种种类个数无限为例,给出模板

    代码 
    #include<iostream>
    usingnamespace std;
     
    constint _max = 10001;
    //c1是保存各项质量砝码可以组合的数目
    //c2是中间量,保存每一次的情况
    intc1[_max], c2[_max];  
    intmain()
    {   //int n,i,j,k;
        int nNum;  //
        int i, j, k;
     
        while(cin >> nNum)
        {
           for(i=0; i<=nNum; ++i)   // ---- ①
           {
               c1[i] = 1;
               c2[i] = 0;
           }
           for(i=2; i<=nNum; ++i)   // ----- ②//第i个表达式
           {
     
               for(j=0; j<=nNum; ++j)   // ----- ③j表示前一个表达式的项数(即使某一项不存在,也无所谓,因为若第i像不存在的话c1[i]=0)
                  for(k=0; k+j<=nNum; k+=i)  // ---- ④k表示后一个表达式所能取到的指数
                  {
                      c2[j+k] += c1[j];
                  }
               for(j=0; j<=nNum; ++j)     // ---- ⑤
               {
                  c1[j] = c2[j];
                  c2[j] = 0;
               }
           }
           cout << c1[nNum] << endl;
        }
        return 0;
    }
  • 相关阅读:
    poj 1743 Musical Theme 后缀数组
    poj 1743 Musical Theme 后缀数组
    cf 432D Prefixes and Suffixes kmp
    cf 432D Prefixes and Suffixes kmp
    hdu Data Structure? 线段树
    关于position和anchorPoint之间的关系
    ios POST 信息
    CALayers的代码示例
    CALayers详解
    ios中得sqlite使用基础
  • 原文地址:https://www.cnblogs.com/acSzz/p/2596879.html
Copyright © 2011-2022 走看看