算法.集合的划分

0.问题描述

(集合划分) 集合 X 的划分是 X 的非空子集的集合,使得每个 X 的元素 x 都只包含在这些 子集的其中一个内。 等价的说,X 的子集的集合 P 是 X 的划分,
如果:
(1)P 的元素都不是空集。(注:某些定义不需要这个要求)
(2)P 的元素的并集等于 X。(我们称 P 的元素覆盖 X。)
(3)P 的任何两个元素的交集为空。(我们称 P 的元素是两两不相交。)
例子:
集合 {1,2,3} 有五个划分。 {{1},{2},{3}} {{1,2},{3}} {{1,3},{2}} {{1},{2,3}} {{1,2,3}}

1.思想

先把前n-1个元素进行处理,再考虑第n个元素的情况。如果第n个元素自己单独一个集合,则共有F(n-1,m-1) 种分配方法,如果第n个元素和别人在一起,则有m * F(n-1,m)种分配方法。所以一共有F(n,m) =F(n-1,m-1) + m * F(n-1,m)种分配方法。
已知的情况是 n = m时 F(n,m) = 1; m = 1时;F(n,m) = 1; n = 1时F(n,m) = 1;
已知递推方程和起始条件,问题可解

2.伪代码

F(n,m)

  1. if(n == 1 || m == 1) return 1;
  2. else return F(n-1,m-1)+m*F(n-1,m);

猜你喜欢

转载自blog.csdn.net/qq_41359808/article/details/88701507