Summary

如果你遇到的问题,自己不确定是排列还是组合,但确定想求出摆放的全部方式,那么可以用逐步分析法。

  • 0.首先确定这个问题的次序重要不?
    • 1.重要
      • 重要就用排列,然后继续确认能重复吗?
        • 1.1 重复排列
          • 公式:\(n^{r}\)(n 是被选择的东西的个数,而我们要选 r次)
        • 1.2 不重复排列
          • 公式:P(n,r)
    • 2.不重要
      • 不重要就用组合,然后继续确认能重复吗?
        • 2.1 重复组合
          • 公式:H(n,r)
        • 2.2 不重复组合
          • 公式:C(n,r)

Reference

https://www.shuxuele.com/combinatorics/combinations-permutations.html

Online Tool

https://gadget.chienwen.net/x/math/percomb

Cracking the Safe!

If you will to cracking a safe, password just four , each-password have 0 to 9 probability , Can you crack the safe?

Notice:

  • Passwords 1100 and 0011 are different!

这个密码排列的特征是:

  • 次序重要
  • 可重复

那么就选重复排列方式计算即可。

Code:

import itertools

product_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
product = list(itertools.product(product_list, repeat=4))
print("product number :", len(product))
print("product list: ", product)

# out:
product number : 10000
product list:  [(1, 1, 1, 1), (1, 1, 1, 2), (1, 1, 1, 3), (1, 1, 1, 4) ... ]

计算比赛前三名有多少种排列方式?

有一场比赛,分别有 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'), ... ]

Can you win the lottery?

假设彩票的玩法是从编号为01~33个球中随机抽出6个,顺序不重要。你选6个数组合成一注彩票,如果所选的6个号码都中了,就表示你中了1等奖。
那么有多少种组合情况?

Notice:

  • If you take the ① ball, you won't be able to take the ① ball later.

这个中奖号码组合的特征:

  • 次序不重要
  • 不可重复

用不可重复组合求即可。

from itertools import combinations, permutations
from scipy.special import comb, perm

C = comb(33, 6)
# out: C = 3.0
print("combinations number: ", C)

itering = combinations(
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
     32, 33], 6)
Clist = list(itering)
with open('temp.txt', 'w') as f:
    for i in Clist:
        f.writelines(str(i) + "\r")


# out:
combinations number:  1107568.0

out:

How make a pill?

假设有个神仙要你用5种材料('人参', '萝卜', '火龙果', '鹿茸', '熊掌')做一个仙丹,需要按照一种特定的配方,但是配方不告诉你,只告诉你做的规则,顺序无所谓,需要配3种材料,可以有重复。
你知道你要尝试多少次才能找到配方做出仙丹?

Notice:

  • 食材摆放位置不影响结果,比如说 煮('人参', '鹿茸', '熊掌') 或者 煮('熊掌', '鹿茸', '人参') 出来的丹都是一样的。

这个配方组合的特征:

  • 次序不重要
  • 可重复

用重复组合求即可。

import itertools

c_list = ['人参', '萝卜', '火龙果', '鹿茸', '熊掌']
clist = list(itertools.combinations_with_replacement(c_list, 3))

print("一共有多少种组合: ", len(clist))
print("List: ", clist)


#out:
一共有多少种组合:  35
List:  [('人参', '人参', '人参'), ('人参', '人参', '萝卜'), ('人参', '人参', '火龙果'), ('人参', '人参', '鹿茸'), ('人参', '人参', '熊掌')...]

Think

Do you know any other application scenarios?

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