HDOJ 1028 母函数解法

题目略。

什么是母函数?
在数学中,某个序列的母函数,是一种形式幂级数,
其每一项的系数可以提供关于这个序列的信息。使用母函数解决问题的方法称为母函数方法。 母函数可分为很多种,包括普通母函数、指数母函数、L级数、贝尔级数和狄利克雷级数。对每个序列都可以写出以上每个类型的一个母函数。构造母函数的目的一般是为了解决某个特定的问题,因此选用何种母函数视乎序列本身的特性和问题的类型。

母函数的定义:
对于序列a0,a1,a2….构造一个函数
G(x) = a0 + a1*x + a2*x^2……..an + x^n.
对于上述的函数G(x)就是a0,a1,a2….an,的母函数。

问题分两类。一类是1个,一类是无限个。一般是遇见无限个问题较多。如果是1个还母函数干嘛,暴力不好吗。母函数可以解决的问题,目前我的理解是,要在若干个固定数值里选取满足和为x的方法的总数。这道题就很容易转换成母函数问题了。把1-n若干个,求他们组合成n的方法总数嘛。

模板如下

#include
#define max(a,b) a>b?a:b
#define min(a,b) a
using namespace std ;
typedef long long ll;
typedef unsigned long long ull;

const int _max = 10001;   
// c1是保存各项质量砝码可以组合的数目  
// c2是中间量,保存每一次的情况  
int c1[_max], c2[_max];     
int main()  
{   //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)  
        { 

            for(j=0; j<=nNum; ++j)   
                for(k=0; k+j<=nNum; k+=i)  
                {  
                    c2[j+k] += c1[j];  
                }  
                for(j=0; j<=nNum; ++j)    
                {  
                    c1[j] = c2[j];  
                    c2[j] = 0;  
                }  
        }  
        cout << c1[nNum] << endl;  
    }  
    return 0;  
}  

你可能感兴趣的:(HDOJ,母函数)