计数类问题可以分排列 或 组合 类型,区别在于他们的摆放的位置是不是重要的,组合类问题里,摆放位置是不重要的,ab和ba是一样的。
组合只关心元素是不是包含在其中。
排列和组合的共性
他们的共性就是,看每个位置里是不是能重复取已经取过的元素。
可重复的组合案例——配药
假设有个酮仁堂做的补药非常受市场欢迎,他公布他用了5种材料('人参', '萝卜', 鹿茸', '熊掌','猪鞭')做一份补药。
你想模仿,但是配方不告诉你,你偷偷打听到,其实只需要其中3种材料,3种材料可能还会重复材料,那么你知道你需要尝试多少次,才能试出补药配方吗?
补药摆放位置不影响结果,比如说 煮('人参', '鹿茸', '鹿茸') 或者 煮('鹿茸', '人参', '鹿茸') 出来的补药都是一样的。
套公式 H(m,n) = H(5,3) = 35
可重复排列案例——重复排列锁

上图是一个重复排列锁,设定的密码是924,那么你用429、942、249都不能打开它。
这体现了在这个场景里,元素所处于的位置很重要,元素改变了位置就不是同一个了。
除了元素摆放的位置很重要,还有一个特点,每个位置的元素可以重复取同样的,比如你可以设密码是924,也可以是994,甚至是999。
求这个锁有几种排法?
重复排列数的求总次数,就是求M自乘N次,P(10,3) = 1000
m=10 (因为0-9 ,有10种)
问题分析过程
-
首先确定这个排列方式是否具有顺序 ?
-
要求顺序
- 位置里的元素能重复吗?
- 1.1 重复排列
- 公式:$ P(n,m) = n^m $ (n 是被选择的总个数,而我们要选 m 次)
- 1.2 不重复排列
- 公式:$ P(n, m) = \frac{n!}{(n-m)!} $
- 1.1 重复排列
- 位置里的元素能重复吗?
-
不要求顺序
- 位置里的元素能重复吗??
-
2.1 重复组合
- 公式:$ H(n,r) = C(n + r - 1, r) = \frac{(n + r - 1)!}{r! (n - 1)!} $
-
2.2 不重复组合
- 公式:$ C(n, m) = \frac{ n! } {(m! * (n-m)!)} $
-
- 位置里的元素能重复吗??
案例——计算比赛前三名有几种排法?
有一场比赛,分别有 A,B,C,D,E,F,G,H 共8支队伍参加,现在想算前三名的排列情况有多少种?
Notice:
- If "A" comes first, it cannot come second .
这个名次排列的特征:
- 次序重要
- 不可以重复
就选不重复排列方式计算即可。
from itertools import permutations
itering = permutations(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'], 3)
plist = list(itering)
print("前三名的排列有多少种: ", len(plist))
print("permutations list: ", plist)
# out
前三名的排列有多少种: 336
permutations list: [('A', 'B', 'C'), ('A', 'B', 'D'), ('A', 'B', 'E'), ('A', 'B', 'F'), ... ]
Tool
排列和组合计算器
https://permutation-combination-calculator.bchrt.com/
Online Tool
https://gadget.chienwen.net/x/math/percomb
浙公网安备 33010602011771号