hdu 2082 母函数

题意:

       每个单词有个价值,给你每个单词的数量,求组合的单词总价值不大于50的种类数。


解法:

       母函数的最基本应用。

       

        可以参考@matrix67大神的博客,但是我不知道为什么M67大神觉得母函数太丑非要说成生成函数。http://www.matrix67.com/blog/archives/120

        

         简单的例子举例啦。

 例子一:

                题目:有质量为1,2,3,的砝码个一枚,求可以称出多少种的质量?要称出质量为3的物品,方案数量?

                

               各有一枚的话,

                一个1克的砝码,(1+x),1代表的是可以不用,x代表的是使用,同理的到(1+x^2),(1+x^3)

                G(x)=(1+x)(1+x^2)(1+x^3)  ##一定要注意x并没有实际意义。

                        =1+x+x^2+2x^3+x^4+x^5+x^6

                从式子中我们可以得知,这些砝码可以称出的质量范围是1~6克的物品,并且知道每种重量的方案数。

                答案:6种(如果0克也算一种的话,那么当然是7种了)。质量为3的方案数量是2,从系数中可以得出。

               注: 如果每个砝码为无穷个:G(x)=(1+x+x^2+x^3....)(1+x^2+x^4.....)(1+x^3+x^6+.....)


例子二:

               题目来自《组合数学》,解法来自@matrix67。

              题目:从苹果、香蕉、橘子和梨中拿一些苹果出来,要求苹果只能拿偶数个,香蕉的个数要是5的倍数,橘子最多只能拿4个,梨子要么不拿,要么只能拿一个,求拿n个水果的方案数?#现实生活中难道真有这么无聊的事情?

              通过上一个题的举例我们很容易列出每一中水果的函数了;

              苹果:1+x^2+x^4+x^6.......

              香蕉:1+x^5+x^10+x^15........

              橘子:1+x+x^2+x^3+x^4

              梨子:1+x

             乘积得到G(x)=(1+x^2....)*(1+x^5....)*(1+x+x^2+x^3+x^4)*(1+x)//化简式子

                                     =[1/(1-x^2)]*[1/(1-x^5)]*[(1-x^5)/(1-x)] *(1+x)//用笔化简一下就好了,这个博客不是很会用

                                     =1/[(1-x)^2]

                                     =(1-x)^(-2)

                                    = C(1,0)+C(2,1)X+C(3,2)X^2+C(4,3)X^3.....

                                   = 1 + 2x + 3X^2+ 4 X^3....

                这样我们就得到了答案,拿n个水果的方案数n+1(次方前面的系数)。

               说明: 基础知识的储备:1, 1+x^2+x^4.....=1/(1-x^2)

                                                                2,    (1-x)^(-k)=C(n+k-1,n) x^n//上面的式子就没有什么问题了。


对于这道题就是很简单的母函数应用了。

              对于样例一:(1+x^1)(1+x^2)(1+x^3)=1+x+x^2+2x^3+x^4+x^5+x^6

                                         次方小于5的方案数   1+1+2+1+1=7

/*************************************************************************
    > File Name: hdu2082.cpp
    > Author: cy
    > Mail: [email protected] 
    > Created Time: 2014/8/18 21:26:41
 ************************************************************************/

#include
#include
#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include 
#include 

#define maxn 50000+5

#define inf 0x3f3f3f3f
  #define INF 0x3FFFFFFFFFFFFFFFLL
#define rep(i,n) for(i=0;i>T;
	while(T--)
	{
		int num[60];//代表每种次方下的个数
		int temp[60];
		rep(i,60)
		{
			num[i]=0;
			temp[i]=0;
		}
		num[0]=1;//常数的个数
		reP(i,26)
		{
			int n;
			cin>>n;
			if(n==0)continue;//
			for(j=0;j<=50;j++)
			{
				for(k=0;k<=n&&k*i+j<=50;k++)//k代表次方
				{
					temp[k*i+j]+=num[j];
				}
			}
			for(j=0;j<=50;j++)
			{
				num[j]=temp[j];
				temp[j]=0;
			}
		}
		int ans=0;
		for(i=1;i<=50;i++)
		{
			ans+=num[i];
		}
		cout<


                                

                  

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