组合数学篇(排列与组合基础篇)
本文是基于数理知识学习过程中的个人笔记,个人理解可能存在偏差与错误,望读者多多指正。
参考书籍:《现代数学手册·近代数学卷》
1.加法法则与乘法法则
加法法则:若事件
A
A
A有
m
m
m种可能,事件
B
B
B有
n
n
n种可能,则事件
A
A
A和
B
B
B的事件有
m
+
n
m+n
m+n种可能。
乘法法则:若事件
A
A
A有
m
m
m种可能,事件
B
B
B有
n
n
n种可能,则同时有事件
A
A
A与事件
B
B
B的事件有
m
n
mn
mn种可能。
2.排列与组合
D
e
f
1
Def1
Def1 从
n
n
n个不同元素中取
r
r
r个按顺序排列,称为从
n
n
n中取
r
r
r个排列,其排列数用
P
(
n
,
r
)
P(n,r)
P(n,r)表示。
D
e
f
2
Def2
Def2 从
n
n
n个不同元素中取
r
r
r个而不考虑它的顺序时,称为从
n
n
n中取
r
r
r个组合,其组合数用
C
(
n
,
r
)
C(n,r)
C(n,r)或
(
n
r
)
\dbinom{n}{r}
(rn)表示。
排列数和组合数计算基本公式:
P
(
n
,
r
)
=
n
!
(
n
−
r
)
!
P(n,r)=\dfrac{n!}{(n-r)!}
P(n,r)=(n−r)!n!
P
(
n
,
r
)
=
r
!
C
(
n
,
r
)
P(n,r)=r!C(n,r)
P(n,r)=r!C(n,r)
C
(
n
,
r
)
=
P
(
n
,
r
)
r
!
C(n,r)=\dfrac{P(n,r)}{r!}
C(n,r)=r!P(n,r)
C
(
n
,
r
)
=
n
!
r
!
(
n
−
r
)
!
C(n,r)=\dfrac{n!}{r!(n-r)!}
C(n,r)=r!(n−r)!n!
3.一一对应
实例1:100名选手淘汰赛,产生一名冠军,要进行多少场比赛
答案:99场,淘汰99名选手产生一名冠军
实例2:如图坐标网格,从
(
0
,
0
)
(0,0)
(0,0)到
(
m
,
n
)
(m,n)
(m,n)有多少条道路,不允许x轴、y轴负方向移动
问题的本质,总共要走
m
+
n
m+n
m+n步到达终点,与朝
x
x
x方向的
m
m
m步与朝
y
y
y方向的
n
n
n步一一对应,问题简化为在
m
+
n
m+n
m+n个格子中选择
m
m
m个
x
x
x方向运动格子的问题,即数目为
C
(
m
+
n
,
m
)
C(m+n,m)
C(m+n,m)
4.允许重复的组合
从
n
n
n个不同元素中取
r
r
r个进行组合,每个元素允许重复,则组合数为
C
(
n
+
r
−
1
,
r
)
C(n+r-1,r)
C(n+r−1,r)
P
r
o
o
f
Proof
Proof:
设
n
n
n个不同元素分别为
1
,
2
,
⋯
,
n
1,2,\cdots,n
1,2,⋯,n,其中
1
1
1个元素选取,没法重复选取
C
(
n
,
1
)
C(n,1)
C(n,1)
2
2
2个元素选取,多了
1
1
1个元素可以进行重复选取
C
(
n
+
1
,
2
)
C(n+1,2)
C(n+1,2)
3
3
3个元素选取 ,多了
2
2
2个元素可以进行重复选取
C
(
n
+
2
,
3
)
C(n+2,3)
C(n+2,3)
⋯
\cdots
⋯
r
r
r个元素选取,多了
r
−
1
r-1
r−1个元素可以重复选取
C
(
n
+
r
−
1
,
r
)
C(n+r-1,r)
C(n+r−1,r)
3中图由python代码绘制
代码参考如下,由gpt协助生成
import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.axisartist as axisartist
# 创建一个画布
fig = plt.figure()
# 使用axisartist.Subplot方法创建一个绘图区对象ax
ax = axisartist.Subplot(fig, 111)
# 将绘图区对象添加到画布中
fig.add_axes(ax)
# 通过set_axisline_style方法设置绘图区的底部及左侧坐标轴样式
# "-|>"代表实心箭头:"->"代表空心箭头
ax.axis["left"].set_visible(False)
ax.axis["bottom"].set_visible(False)
# 添加新的基于原点的 x 和 y 坐标轴
ax.axis["x"] = ax.new_floating_axis(0, 0)
ax.axis["y"] = ax.new_floating_axis(1, 0)
# 设置 x 坐标轴箭头
ax.axis["x"].set_axisline_style("-|>", size=1.5)
# 设置 y 坐标轴箭头
ax.axis["y"].set_axisline_style("-|>", size=1.5)
ax.axis["y"].major_ticklabels.set_visible(False)
ax.axis["x"].major_ticklabels.set_visible(False)
# 通过set_visible方法设置绘图区的顶部及右侧坐标轴隐藏
ax.axis["top"].set_visible(False)
ax.axis["right"].set_visible(False)
# 设置 x 和 y 轴的刻度
x_ticks = np.arange(0, 6, 1)
y_ticks = np.arange(0, 6, 1)
plt.xticks(x_ticks)
plt.yticks(y_ticks)
plt.xlim(0, 6)
plt.ylim(0, 6)
# 显示网格
for x in x_ticks:
ax.plot([x, x], [0, 5], color='gray', linestyle='-', linewidth=0.5)
for y in y_ticks:
ax.plot([0, 5], [y, y], color='gray', linestyle='-', linewidth=0.5)
# 在原点处添加文本
plt.text(0, 0, "(0, 0)", fontsize=12, ha='right')
# 在 x 轴和 y 轴末端添加文本
plt.text(6, 0.1, "x", fontsize=12, ha='right')
plt.text(0.1, 6, "y", fontsize=12, va='bottom')
# 在右上角添加点 (m, n) 并标注
m, n = 5, 5
plt.plot(m, n, 'ro')
plt.text(m, n, "(m, n)", fontsize=12, ha='left')
# 显示图形
plt.show()