计数类问题可以分排列 或 组合 类型,区别在于他们的摆放的位置是不是重要的,组合类问题里,摆放位置是不重要的,ab和ba是一样的。

组合只关心元素是不是包含在其中。


排列和组合的共性

他们的共性就是,看每个位置里是不是能重复取已经取过的元素。

可重复的组合案例——配药
假设有个酮仁堂做的补药非常受市场欢迎,他公布他用了5种材料('人参', '萝卜', 鹿茸', '熊掌','猪鞭')做一份补药。

你想模仿,但是配方不告诉你,你偷偷打听到,其实只需要其中3种材料,3种材料可能还会重复材料,那么你知道你需要尝试多少次,才能试出补药配方吗?

补药摆放位置不影响结果,比如说 煮('人参', '鹿茸', '鹿茸') 或者 煮('鹿茸', '人参', '鹿茸') 出来的补药都是一样的。

套公式 H(m,n) = H(5,3) = 35

可重复排列案例——重复排列锁
image
上图是一个重复排列锁,设定的密码是924,那么你用429、942、249都不能打开它。

这体现了在这个场景里,元素所处于的位置很重要,元素改变了位置就不是同一个了。

除了元素摆放的位置很重要,还有一个特点,每个位置的元素可以重复取同样的,比如你可以设密码是924,也可以是994,甚至是999。

求这个锁有几种排法?
重复排列数的求总次数,就是求M自乘N次,P(10,3) = 1000
m=10 (因为0-9 ,有10种)


问题分析过程

  1. 首先确定这个排列方式是否具有顺序

  2. 要求顺序

    • 位置里的元素能重复吗?
      • 1.1 重复排列
        • 公式:$ P(n,m) = n^m $ (n 是被选择的总个数,而我们要选 m 次)
      • 1.2 不重复排列
        • 公式:$ P(n, m) = \frac{n!}{(n-m)!} $
  3. 不要求顺序

    • 位置里的元素能重复吗??
      • 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

posted on 2023-06-08 16:36  Mysticbinary  阅读(122)  评论(0)    收藏  举报