题目:
5 个互不相同的球 ABCDE,分给 甲乙丙 3 人,每人都要分得球,AB 两球不能给同一人。
有多少种分法?
答案:
有 114 种分法。
分析:
不考虑有人未分到的情况
A 球的去向,甲乙丙,3 种;
B 球的去向,拿到 A 的不能再选,2 种;
CDE 三球的去向,都是 3 种;
有 3×2×3×3×3 = 162 种情况。
有人未分到的情况
甲乙丙减去一人,3 种;
A 球的去向,2 种;
B 球的去向,1 种;
CDE 三球的去向,都是 2 种;
有 3×2×1×2×2×2 = 48 种情况。
分法的总数:
有 162-48 = 114 种分法。
画蛇添足的代码
Fortran 语言,枚举算法,结果一致。
! 5 个不同的球 ABCDE,分给甲乙丙 3 人,每人都要分得球,AB 两球不能给同一人。
! 有多少种分法?
! 2023-09-11
! fortran 90
! szw_sh@163.com
integer a(5),b(3)
do i=0,3**5-1 ! 以5位的三进制数模拟甲乙丙
ii=i
b=0
do j=5,1,-1
k=mod(ii,3)+1
a(j)=k
b(k)=b(k)+1
ii=ii/3
end do
if(a(1).eq.a(2)) cycle ! AB同组的,跳过
if(minval(b).eq.0) cycle ! 甲乙丙中有无球的,跳过
m=m+1 ! 计数
write(*,'(a\)') '(' ! 输出具体分组的情况
do j=1,3
do k=1,5
if(a(k).eq.j) write(*,'(a\)') char(64+k)
end do
if(j.lt.3) write(*,'(a\)') ','
end do
write(*,'(a\)') '),'
if(mod(m,6).eq.0) write(*,*)
end do
write(*,'(a,i3)') 'total = ',m ! 输出总数
end
枚举的结果:
(ACD,B,E),(AC,BD,E),(ACE,B,D),(AC,BE,D),(AC,B,DE),(AD,BC,E),
(A,BCD,E),(AE,BC,D),(A,BCE,D),(A,BC,DE),(ADE,B,C),(AD,BE,C),
(AD,B,CE),(AE,BD,C),(A,BDE,C),(A,BD,CE),(AE,B,CD),(A,BE,CD),
(A,B,CDE),(ACD,E,B),(ACE,D,B),(AC,DE,B),(AC,D,BE),(AC,E,BD),
(ADE,C,B),(AD,CE,B),(AD,C,BE),(AE,CD,B),(A,CDE,B),(A,CD,BE),
(AE,C,BD),(A,CE,BD),(A,C,BDE),(AD,E,BC),(AE,D,BC),(A,DE,BC),
(A,D,BCE),(A,E,BCD),(BCD,A,E),(BC,AD,E),(BCE,A,D),(BC,AE,D),
(BC,A,DE),(BD,AC,E),(B,ACD,E),(BE,AC,D),(B,ACE,D),(B,AC,DE),
(BDE,A,C),(BD,AE,C),(BD,A,CE),(BE,AD,C),(B,ADE,C),(B,AD,CE),
(BE,A,CD),(B,AE,CD),(B,A,CDE),(CDE,A,B),(CD,AE,B),(CD,A,BE),
(CE,AD,B),(C,ADE,B),(C,AD,BE),(CE,A,BD),(C,AE,BD),(C,A,BDE),
(DE,AC,B),(D,ACE,B),(D,AC,BE),(E,ACD,B),(E,AC,BD),(DE,A,BC),
(D,AE,BC),(D,A,BCE),(E,AD,BC),(E,A,BCD),(BCD,E,A),(BCE,D,A),
(BC,DE,A),(BC,D,AE),(BC,E,AD),(BDE,C,A),(BD,CE,A),(BD,C,AE),
(BE,CD,A),(B,CDE,A),(B,CD,AE),(BE,C,AD),(B,CE,AD),(B,C,ADE),
(BD,E,AC),(BE,D,AC),(B,DE,AC),(B,D,ACE),(B,E,ACD),(CDE,B,A),
(CD,BE,A),(CD,B,AE),(CE,BD,A),(C,BDE,A),(C,BD,AE),(CE,B,AD),
(C,BE,AD),(C,B,ADE),(DE,BC,A),(D,BCE,A),(D,BC,AE),(E,BCD,A),
(E,BC,AD),(DE,B,AC),(D,BE,AC),(D,B,ACE),(E,BD,AC),(E,B,ACD),
total = 114