从放苹果问题想到的
来源:互联网 发布:2016年新网络大型游戏 编辑:程序博客网 时间:2024/05/17 01:18
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示) 5,1,1和1,5,1 是同一种分法。这个题目等同于 M个非负整数之和为N,问有多少组不同组合。
这个其实是组合数学中的剖分。
称(m1,m2,……,mk)为正整数n的一个剖分,如果m1,m2,……,mk是正整数,n=m1+m2+…+mk,并且n>=m1>=m2>=…>=mk>0,(也就是每个子集均为非空子集),其中mi成为此剖分的项,k为剖分的项数。不同的剖分个数称为剖分数。
剖分的主要性质:
1)把n拆分成不多于k项的剖分数等于把n拆分成最大项不超过k的剖分数。
2)把n拆分成最大项为k的剖分数等于把n拆分成k项的剖分数。
3)把n拆分成互不相同的若干奇数项的剖分数等于把n拆分成有自共轭Ferrer图 像的剖分数。
4)设P(m,n)是把n拆分成各项属于{1,2,…,m}的剖分数,则{P(m,n)}的生成函数是
把n拆分成各项属于{1,2,…,m},且m至少出现一次,其剖分数生成函数是
即P(m,n)-P(m-1,n)。
5)设P(n)是n的剖分数,则序列{P(n)}的生成函数是
若各项次序不同认为是不同的剖分,则把n拆分成r块的剖分数是组合C(n-1,r-1)。如7拆分成4块,其不同的剖分有以下C(6,3)=20种。
注意上述情况中,子集均为非空集。
再来看分苹果的题目,题目是允许出现空集的情况,相当于把M拆分为不多于N项的剖分数。因此可以利用性质1,转化一下,即M拆分为最大项不大于N的剖分数。由此可以得到递推式
P(M,N)=P(M,N-1)+P(M-N,N)
解释一下这个递推式,我们把P(M,N)的剖分分为两类,一类是划分的每一块都小于N的这种剖分,他有P(M,N-1)个;另一类是在划分中至少有一块是N的这种剖分。因为在划分中至少有一块是N,所以问题就变成M-N的每一块小于或等于N的剖分,这种剖分有P(M-N,N)个。
因此由此递推式就可以DP解决这一类问题。当然需要定义好P(M,N)中,M=0或N=0,N=1 或M<N等几种情况。
从上述剖分的描述中,这类题目也可以通过生成函数求解。
该生成函数通过级数展开,x的n次幂的系数即为要求的组合数。
如果题目中的盘子是不相同的,那就等同于求 x1+x2+…+xn=M 的非负整数解的个数。可以用挡板法求解。其实相当于在M个相同的球中插入N-1个相同的挡板。因此组合数
t = (M+N-1)! / ( M! * (N-1)! ) = C(M+N-1,M),即为不同解个数。
- 从放苹果问题想到的
- 从苹果做搜索引擎想到的
- 放苹果问题的递推思路
- 放苹果问题
- 放苹果问题
- 放苹果问题
- <实例>放苹果问题
- 北大-放苹果问题
- 放苹果 问题
- 放苹果问题
- 放苹果问题
- 放苹果问题
- 【DP】放苹果问题
- 递归-放苹果问题
- 放苹果问题
- 从《风声》想到的信仰问题
- 从逻辑、算数移位想到的问题
- 从流控想到的一些问题
- Notepad++快捷键
- Objcet.clone() 和Cloneable 接口
- Web Service & SoapUI
- java excel导出 自己做的实例
- php怎样让浏览器后退时不显示网页过期,而显示原先的页面
- 从放苹果问题想到的
- 12.2.2 无穷序列
- 插件82:发送Ajax请求
- 《人月神话》笔记:贯彻执行
- 【JavaScript】常用JS
- linux 指令 man的用法
- GDB调试
- oracle analyze table的作用
- synchronized的使用方法