本文介绍了排列组合经典问题——n个人平均分成m组的解法(公式),并给出其Python程序,详情如下。
1 解法公式
求n个人平均分成m组的分配法。设分配方法共
N
N
N种,每组
k
=
n
m
k=\frac{n}{m}
k=mn人,则:
N
=
{
0
,
n
<
m
or
n
%
m
≠
0
1
,
n
=
m
C
n
k
C
n
−
k
k
C
n
−
2
k
k
⋯
C
2
k
k
C
k
k
A
m
m
,
n
>
m
and
n
%
m
=
0
N = \begin{cases} 0, & \text{$n<m$ or $n \%m \neq 0$} \\[2ex] 1, & \text{$n=m$} \\[2ex] \frac{C_n^k C_{n-k}^k C_{n-2k}^k \cdots C_{2k}^k C_k^k}{A_m^m}, & \text{$n>m$ and $n \%m=0$} \end{cases}
N=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧0,1,AmmCnkCn−kkCn−2kk⋯C2kkCkk,n<m or n%m=0n=mn>m and n%m=0式中,除以
A
m
m
A_m^m
Amm是为去重。
2 Python程序
Python程序如下:
'''
Author: xyyang
date: 2022-11-11
qq: 1391650991
'''
from scipy.special import comb,perm#组合、排列
def PC_n2m(n,m):
if n<0 or m<0 or (not isinstance(n,int)) or (not isinstance(m,int)):
print("人数或分组数据有误!")
return
if n<m or n%m!=0:
return 0
if n==m: #n%m=0
return 1
if n>m and n%m==0:
k=n//m
N=1
for i in range(m):
N*=comb(n-i*k,k)
N=N/perm(m,m) #去重
return N
if __name__=='__main__':
n=6;m=3
print("{0}人平均分成{1}组,共{2}种方法".format(n,m,PC_n2m(n,m))) #15
#print(f"{n}人平均分成{m}组,共{PC_n2m(n,m)}种方法")
或者
'''
Author: xyyang
date: 2022-11-11
qq: 1391650991
'''
from scipy.special import comb,perm#组合、排列
def PC_n2m(n,m):
if n<0 or m<0 or (not isinstance(n,int)) or (not isinstance(m,int)):
print("人数或分组数据有误!")
return
if n%m!=0:
return 0
else:
if n==m:
return 1
else:
k=n//m
N=1
for i in range(m):
N*=comb(n-i*k,k)
N=N/perm(m,m) #去重
return N
if __name__=='__main__':
n=6;m=3
print("{0}人平均分成{1}组,共{2}种方法".format(n,m,PC_n2m(n,m))) #15
#print(f"{n}人平均分成{m}组,共{PC_n2m(n,m)}种方法")