**輸出所有組合
從 m 個數中有序地拿出 n 個數的方案數為
p mn
=m!(
m−n)
!p_m^n=\frac
pmn=(
m−n)
!m!
簡單解釋就是: m 個數的全排列個數為 m!m!
m!, 如果拿出 n 個數, 那麼就要去掉多出來的所有排列, 所以就要除以 (m−
n)
!(m-n)!
(m−n)!
從 m 個數中不計順序地拿出 n 個數的方案數為
c mn
=m!n
!(m−
n)
!c_m^n=\frac
cmn=n
!(m−
n)!m
!我認為也比較好理解, 在相同 m, n 的條件下, 組合就是不計順序的排列, 所以組合的個數就是排列的個數除以排列的方案, 因此也就是 cmn
=pmn
n!
c_m^n=\frac
cmn=n
!pmn
給定 m 和 n, 輸出乙個長為 m 的陣列的所有排列, 可以用遞迴的方式解決:
遞迴一共有 n 層, 第 i 遞迴會選擇第 i 個位置的輸出, 顯然如果某個位置在之前已經被選過了, 那麼它就不能再被選.
c **如下
#include
#define maxn 100
// 從 m 個數中選出 n 個數來排列
int m, n;
// 用來存放資料
int array[maxn]
;// 用來快取輸出
int buffer[maxn]
;// 用來表示這個位置是否已經被用過
int flag[maxn]
;// 輸出快取中的 n 個數
void
out(
)printf
("\n");
}// 遞迴進行排列, 其中 pos 表示當前要選擇的位置
void
perm
(int pos)
else
// 釋放標記
flag[i]=0
;}}int
main()
perm(0
);}
錯位排列和上面的區別是, 排列的第 i 個數字不能是原本的第 i 個數字.
只需要在上面的**中再加一行**就行了
#include
#define maxm 100
int m, n;
int array[maxm]
;int buffer[maxm]
;int flag[maxm]
;void
perm
(int pos)
printf
("\n");
}else
flag[i]=0
;}}int
main()
perm(0
);}
從 m 個數中選取 n 個數, 假如我們知道 n, 比如 n = 2, 那麼我們可以寫乙個二層 for 迴圈:
for
(int i =
0; i < m; i++
)}
即可輸出所有組合.
因此, 我們可以用遞迴的方式來做到對任意的 n 進行組合:
#include
#define maxm 100
int m, n;
int array[maxm]
;int buffer[maxm]
;void
combo
(int pos,
int from)
printf
("\n");
}else}}
intmain()
combo(0
,0);
}
排列 組合數學
定義 從n個不同的元素中,取出m個不同元素,按照順序排成一列,叫做從n個元素取出m個元素的乙個排列。我們將從n個不同的元素取出m個元素所得到得不同排列數,叫做從n個元素取出m個元素的排列數 記為a n,m 其中n m a n,m n n 1 n m 1 n n m 定義 n個不同元素中取m個不同元素...
8 排列組合
1 2 permutations 3 排列組合 4 輸入abc,輸出所有可能的排列結果 5 輸入 abc 6 輸出 abc 7 acb 8 bac 9 bca 10 cab 11 cba 12 1314 include15 16using namespace std 1718 int c1 0 19...
排列組合(組合數)
儒雅隨和的小趙閒暇時很喜歡古典文學,比如金 金銀角大王和孫悟空。話說悟空一行在西天取經路上遇上了妖怪金角大王 銀角大王,把唐僧 八戒 沙僧 白馬,連行李一道擄去。兩個大王有幾個法寶,其中乙個是個魔葫蘆,妖怪叫誰的名字,誰應一聲,就被吸進葫蘆,兩個時辰化為膿水。孫悟空來鬥妖魔,魔王叫 孫悟空 他應了,...