目錄
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為下角標,...