普通母函数理解篇(PPT)

前辈的优秀博客

母函数入门+模板http://blog.csdn.net/vsooda/article/details/7975485#reply

http://blog.csdn.net/winter2121/article/details/55535894

例一:解决砝码问题若有1克、2克、3克、4克的砝码各一 枚,能称出哪几种重量?各有几种可能方案?

考虑构造母函数,如果用x的指数表示称出来的重量,则

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

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

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

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

(1+x)(1+x^2)(1+x^3)(1+x^4)

=(1+x+x^2+x^3)(1+x^3+x^4+x^7)

=1+x+x^2+2x^3+2x^4+2x^5+2x^6+2x^7+x^8+x^9+x^10  

从上面的函数知道,可称出从1 g到10g,系数就是方案数

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

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

问题二:求用1分,2分,3分的邮票贴出不同数值的方案数(邮票是无限数量的)

母函数为:G(x)=(1+x+x^2+x^3+....)*(1+x^2+x^4+....)*(1+x^3+x^6+....)

n 以展开后的 x 4 为例,其系数为 4 ,即 4 拆分成 1 2 3 之和的拆分数为 4
n   4=1+1+1+1=1+1+2=1+3=2+2

问题三:若有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的和,求其母函数。

母函数:(1+x^1+x^2+...)(1+x^2+x^4+...)(1+x^3+x^6+...)....(1+x^m+x^2m+....)

然后求出x^n的系数即为方案数


问题5:如若上例中 m 至少出现一次,其母函数又如何? 

母函数:(1+x^1+x^2+...)(1+x^2+x^4+...)(1+x^3+x^6+...)....(1+x^m+x^4m+....)

然后求出x^(n-m)的系数即为方案数


6 现有 10 只球,分给 A,B,C,D 四个盒子, A 盒不得少于 4 个, B 盒不得多于 5 个, C 盒只准放偶数 ( 包括 0) D 盒无限制,问有几种分法?


母函数:(x^4+x^5+...+x^10)*(1+x^1+x^2+x^3+x^4+x^5)(1+x^2+x^4+x^6+x^8+x^10)(1+x+x^2+..x^10)

7 :求方程 x1+x2+...+ xk =m 的所有正整数解的个数 ;
这个不会QAQ

怎么样实现这个母函数运算呢;

用计算机模拟人算的结果

举个例子:

(1+x)*(1+x^2)*(1+x^3)

1 先算前两个括号

拿1先 乘后面一个括号得到1+x^2,然后再拿x乘后面一个括号得到x+x^3

然后相加得到 1+x+x^2+x^3

2然后再算剩下两个括号

(1+x+x^2+x^3)*(1+x^3)

步骤同上

现在以 每种种类无限为例给出模板。自己用的时候要变通

#include<iostream>
using namespace std;
const int _max=10001;
int c1[_max];//c1 是保存各项质量砝码可以组合的数目
int c2[_max];//c2 是中间量 ,保存每一次的情况 
int main()
{
	int nNum;
	int i,j,k;
	
	while(cin>>nNum)
	{
		for(i =0;i<=nNum;++i)//对c1 初始化,由第一个表达式( 1+x+x^2+..+x^n)初始化 
		{
			c1[i]=1;
			c2[i]=0;
		}
		for(i=2;i<=nNum;i++)//第一个式子 依次跟后面相乘 
		{
				for(j=0;j<=nNum;++j)//j从0到n遍历,这里的j就是(前面i个表达式累乘的表达式) 里的第j个变量 
				  for(k=0;k+j<=nNum;k+=i)//k 表示第j个指数,所以k每次增i 因为第i个表达式 的增量为i 
				  {
				  	c2[j+k]+=c1[j];
				  }
				for(j=0;j<=nNum;j++)//把c2的值赋给c1,而把c2初始化为0 ,因为c2每次是从一个表达式开始的 
				{
					c1[j]=c2[j];
					c2[j]=0;
				 } 
		 } 
	 } 
	return 0;
}










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值