题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1292
问题
一共有n个同学参加夏令营,这些同学进行自由组队(每对人数不限),一共会有多少种不同的组队方案呢?
公式推导
设 f(n, m)(1 <= m <= n) 表示 n 个人分成 m 组,这样子的分组方案数量。
设 F(n) = f(n,1) + f(n,2) + ... + f(n,n),即为 n 个人的总分组方案数量。
可以知道:
f(n,n) = 1(每个人一组,显然只有一种分组方案),
f(n,1) = 1(所有人都在同一个组里,显然只有一种分组方案)。
假如已经推算出 n 个人分成 m 组的分组方案,此时增加一个人依然拆分成m组,相比之前到底改变了什么呢?
- 新人加入到了原来的分组里,那么新人可以在每个方案的 m 组里任选一组来加入,f(n+1, m) = f(n, m) * m;
- 新人单独构成一组,他没有加入任何组,那么想要凑到 m 组只需之前的 n 个人分成 m-1 组的方案分别加上新人所在组,f(n+1, m) = f(n, m-1);
由以上互斥的两种情况合并得:
f(n + 1, m) = f(n, m) * m + f(n, m - 1)
分组方案举例以及带入公式计算校验
a
ab
a b
abc
ac b
a bc
ab c
a b c
abcd
acd b
ac bd
ad bc
a bcd
abd c
ab cd
ad b c
a bd c
a b cd
abc d
ac b d
a bc d
ab c d
a b c d
f(1, 1) = 1
f(2, 1) = 1
f(2, 2) = 1
f(3,3) = 1
f(3,2) = f(2,2) * 2 + f(2,1) = 3
f(3,1) = 1
f(4,1) = 1
f(4,2) = f(3,2) * 2 + f(3,1) = 3 * 2 + 1 = 7;
f(4,3) = f(3,3) * 3 + f(3,2) = 1 * 3 + 3 = 6;
f(4,4) = 1
F(4) = 15