定義 1.排列 排列,一般地,從n個不同元素中取出m(m≤n)個元素,按照一定的順序排成一列,叫做從n個元素中取出m個元素的一個排列。特別地,當m=n時,這個排列被稱作全排列。 用Αnm表示“從n個元素里取m個元素,排成一排的方案數”,也就是Αnm=n!/(n-m)! ,將它稱為排列數。 註:n!即 ...
定義
1.排列
排列,一般地,從n個不同元素中取出m(m≤n)個元素,按照一定的順序排成一列,叫做從n個元素中取出m個元素的一個排列。特別地,當m=n時,這個排列被稱作全排列。
用Αnm表示“從n個元素里取m個元素,排成一排的方案數”,也就是Αnm=n!/(n-m)! ,將它稱為排列數。
註:n!即為n的階乘,記作n!=n×(n-1)×…×2×1。例如3!=6,4!=24,5!=120……
2.組合
組合是一個數學名詞。一般地,從n個不同的元素中,任取m(m≤n)個元素為一組,叫作從n個不同元素中取出m個元素的一個組合。我們把有關求組合的個數的問題叫作組合問題。
用Cnm表示“從n個元素裡面選出m個元素”的方案數,也就是Cnm=n!/m!(n-m)! ,特殊的Cn0=1。
又易由加法原理得Cnm=Cn-1m-1+Cn-1m ,這就是組合數的遞推公式,又叫帕斯卡公式這裡本來想加個鏈接的,但是根本搜不到。
用法
如果想求Cnm,那麼可以使用以下這段代碼
#include<bits/stdc++.h> #define ll long long using namespace std; ll c[25][25]; int n,m; int main(){ cin>>n>>m; for(int i=0;i<=21;i++) { c[i][0]=c[i][i]=1; for(int j=1;j<i;j++) c[i][j]=c[i-1][j]+c[i-1][j-1]; //遞推 q(≧▽≦q) } cout<<c[n][m]<<endl; return 0; }
這樣就可以通過O(n2)的演算法複雜度得到一個組合數表。之後若想找組合數,直接在表中查詢即可。
碼字不易,點個贊唄§(* ̄▽ ̄*)§