C語言中遞迴和排列組合詳解

2022-09-20 08:54:11 字數 872 閱讀 7230

目錄

1.列印n個數的全排列

2.列印n個數中任意m個數的全排列

3.列印n個數中任意m個數的組合

這個題實際上是可以直接用stl中的next_permutation()函式,**如下:

#include

using namespace std;

int main();

sort(data,data+4);//先排序得到字典序最小的序列

do//也可以用stl的swap函式,但是速度慢一些

int data=;

int num=0;

void perm(int begin,int end)

}}int main(),子集共有2的n次方個,其中包括空集。

例如乙個n=3的集合,其子集為,,,,,,,。為什麼以這個順序來排呢?因為這樣非常符合二進位制位權值的思想。剛好可以和二進位制對應:

φa0a1a1 a0a2a2 a0a2 a1a2 a1 a0000001010011100101110111

如何輸出這些子集?,還是利用二進位制位權的思想,利用相與運算得出其二進位制數中的每乙個1,直接對應數字,完全**如下:

#include

using namespace std;

void print_subset(int n)

回到問題3,要找到任意m個數的組合,只需要做乙個判斷:確定乙個子集對應的二進位制數中1的數量。www.cppcns.com這是解題的關鍵。

有乙個很巧妙的做法:kk=kk&(kk-1)

重複使用該式子,直到kk為0,即可得出1的數量。

#include

using namespace std;

void print_subset(int n,int k)

遞迴實現排列組合

置換 給定n大於等於1個元素的集合,列印這個集合所有可能的置換。我們通過觀察集合,得到生成所有置換的簡單演算法,以下是演算法的構造過程 1 a跟在 b,c,d 的所有置換之後。2 b跟在 a,c,d 的所有置換之後。3 c跟在 a,b,d 的所有置換之後。4 d跟在 a,b,c 的所有置換之後。in...

排列 組合 遞迴 搜尋

1 給乙個字串,輸出它的全排列 思想 遞迴,先考慮第乙個位置能出現的所有字元,然後遞迴考慮第二個位置能出現的字元.include include includeusing namespace std void permutation char pstr,char pbegin int main 用模...

排列組合及遞迴

置換 substitution 將n個事物按順序進行排列,記作p n為上下角標 n!排列 permutation 從n個事物中取出一部分進行排列,記作p n為下角標,k為上角標 n n 1 n k 1 n!n k 組合 combination 不考慮順序 先順序計數,再除重複度 記作c n為下角標,...