大家還記得我們在高中或者是在初中(具體什麼時候忘記了)的時候在數學上學的排列與組合嗎?記得那時候我的數學老師非得讓我們把排列與組合的定義背的滾瓜爛熟的,但是,我到現在也背不上來,如今,在程式設計上又讓我們相見,哈哈,緣分吶!
現在,就讓我們一起回顧一下什麼叫作排列,什麼叫作組合吧。
1.排列
定義:在數學上——從n個不同元素中,任取m(m≤n,m與n均為自然數,下同)個元素按照一定的順序排成一列,叫做從n個不同元素中取出m個元素的乙個排列;從n個不同元素中取出m(m≤n)個元素的所有排列的個數,叫做從n個不同元素中取出m個元素的排列數,用符號 a(n,m)表示。a(n,m)=n(n-1)(n-2)……(n-m+1)= n!/(n-m)!
2.組合
定義:在數學上——從n個不同元素中,任取m(m≤n)個元素並成一組,叫做從n個不同元素中取出m個元素的乙個組合;從n個不同元素中取出m(m≤n)個元素的所有組合的個數,叫做從n個不同元素中取出m個元素的組合數。用符號 c(n,m) 表示。c(n,m)=a(n,m)/m!;c(n,m)=c(n,n-m)。(n≥m)
看見了吧,定義真的好長,現在我們不要太咬文嚼字了,我們來歸納和區分一下排列與組合,所謂排列,就是指從給定個數的元素中取出指定個數的元素進行排序。組合則是指從給定個數的元素中僅僅取出指定個數的元素,不考慮排序。即,排列考慮順序,組合不用考慮順序。排列組合的中心問題是研究給定要求的排列和組合可能出現的情況總數。
好了,對於排列和組合應該了解了吧。下面就從最基本的給你乙個n,代表有n個數,分別用排列和組合的方式把兩個數排列、組合起來,輸出結果。
1.排列
#include
int main()
for(i=0; ifor(j=i; j//**j=i**}}
}return
0;}
2.組合
#include
int main()
for(i=0; ifor(j=0; j//**j=0**}}
}return
0;}
看似簡單的排列與組合,其實一點都不簡單,有一道題以前已經寫過了,可以看一下的。 排列與組合
include using namespace std void perm int a,int n,int m,int out,int k,int used cout endl for int i 0 i n i void combine int a,int n,int m,int out,int ...
組合與排列
定義 從 n 個不同元素的集合中,任意取出 m m n 個元素排成一列 有先後順序 稱為乙個排列 此種排列的總數即為排列數,即叫做從 n 個不同元素中取出 m 和元素的排列數。公式 當 n m 時,分母為 0 1,即為全排列 推導 在具有 n 個數的集合中,順序取出 m 個數,成為乙個排列。上述過程...
排列與組合
試想這樣乙個問題 一組數比如 任取其中的三邊,會構成多少種不同的三角型 又或者任取其中四邊,會構成多少種不同的多邊形?如果取三邊,或五邊又如何?在一些情況下,我們需要解決處理排列和組合數的問題 先來看一下排列的情況 abcd 下標 1234 解決乙個陣列平移的問題並不難 abcd 向左移動4次,就可...