计数原理
1 ) 分类相加
做一件事情,完成它有n类办法,在第一类办法中有m1种不同方法,第二类有m2种不同方法 … 在第n类办法中有mn种不同的方法,完成这件事共有 N=m1+m2+m3+...+mn 种不同方法
2 ) 分步相乘
做一件事情,完成它有n个步骤,做第一个步骤有m1种不同方法,第二个步骤有m2种不同方法…做第n个步骤有mn种不同的方法. 那么完成这件事共有 N=m1∗m2∗...∗mn 种不同的方法
排列
1 )概念
- 排列:从n个不同元素中,任取m(m<=n)个元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列
- 排列数:从n个不同元素中,取出m(m<=n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数 Anm
- 排列是有序的
2 ) 公式
- Anm=n(n−1)(n−2)...(n−m+1)
- Anm=(n−m)!n!
- Anm=n!
- 规定 0! = 1
组合
1 )概念
- 组合:从n个不同元素中,任取m(m<=n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合
- 组合数:从n个不同元素中,取出m(m<=n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数 Cnm
- 组合不考虑顺序
2 )公式
- Cnm=m!n(n−1)(n−2)...(n−m+1) 或 Cnm=m!(n−m)!n!
- Cnm=Cnn−m
- 规定 Cn0=1
排列与组合的关系
- Anm=Cnm∗Amm
- 排列就是先组合再全排列
- Cnm=AmmAnm=m(m−1)...2∗1n(n−1)...(n−m+1)=m!(n−m)!n! (m <= n)
- 排列 An+1m=Anm+mAnm−1
- 组合 Cn+1m=Cnm+Cnm−1
使用python来测试排列和组合
import itertools
x = list(range(7))
print(x)
a = itertools.permutations(x, 3)
b = itertools.combinations(x, 3)
print(len(list(a)))
print(len(list(b)))