original question is as following, "问题是有多少可能的组合。 如果我们有30个人, 我们要分成10个小组, 各个小组有至少2个人" As constant said "好象只能递推"www.ddhw.com 我们来考虑一般的情况:N 个人分成 M 组, 每组至少 L 个人。假设有 T(N, M; L) 种可能的组合。 有如下的递推关系式, T(N+1, M; L) = M * T(N, M; L) + C(N, L-1) * T(N+1-L, M-1; L) C(N, L-1) 代表组合数. 第一项 M * T(N, M; L) 表示一个给定的人所在的组不少于 N+1 个人的可能组合个数. 第二项 C(N, L-1) * T(N+1-L, M-1; L) 表示这个给定的人所在的组正好 N 个人的可能组合个数. 对于 L=1, 我们有 T(N+1, M) = M * T(N, M) + T(N, M-1) . 对于这种情况, 我们利用容斥原理可以得到一个级数表示. 先假定这M各组是可分辨的, 依次记为第一组, 第二组, 等等. 那么 第一组至少有一个人的可能组合有 M^N - (M-1)^N, 记为 S(1)www.ddhw.com 第一或第二组至少有一个人的可能组合有 M^N - (M-2)^N, 记为 S(2) 明显 S(K) = M^N - (M-K)^N 容斥原理给出 U(N, M) = M * S(1) - C(M, 2) * S(2) + C(M, 3) * S(3) + ... + (-1)^(M+1) * S(M) 稍加整理得到 U(N, M) = sum (-1)^K * C(M, K) * (M-K)^N, K = 0 .. M-1 如果考虑这M各组是不可分辨的, 需要除以 M! 这样 T(N, M) = U(N, M)/M! 可以验证T(N, M)满足前面的递推关系. 如果L>=2, 需要利用前面的递推关系, 编程计算. www.ddhw.com
|