组合数学篇(排列与组合基础篇)

组合数学篇(排列与组合基础篇)

本文是基于数理知识学习过程中的个人笔记,个人理解可能存在偏差与错误,望读者多多指正。
参考书籍:《现代数学手册·近代数学卷》

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)=(nr)!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!(nr)!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+r1,r)
P r o o f Proof Proof:
n n n个不同元素分别为 1 , 2 , ⋯ , n 1,2,\cdots,n 12n,其中
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 r1个元素可以重复选取 C ( n + r − 1 , r ) C(n+r-1,r) C(n+r1,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()


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值