遞迴學習 組合 全組合排列

2021-05-28 14:18:06 字數 948 閱讀 5040

sample input

1 2 3

sample output

#include using namespace std;

const int len = 10;

int n;

int mat[len];

int result[len];

bool used[len]; //初始值為false,表示都沒有使用過

void solve(int level);

int main()

solve(0);

system("pause");

return 0;

}/*----------------------

操作的目的:普通選擇性組合排列

初始條件:

n:記錄選取資料的總位數

mat陣列:儲存選取資料

used陣列:標記是不是用過

result陣列:儲存已得到的結果

操作結果:

輸出result陣列,所有的選擇性組合排列

函式引數:

level:既代表遞迴的層次,也代表result陣列已經處理到第幾位了

一句話就是:把沒用過的數放到result陣列的第level位上

------------------------*/

void solve(int level)

{ if (level == n)

{ for (int i=0;i注意:根據例項知,輸出資料的時候,總是把所有資料都用過一邊,無論該數字是在自己之前還是之後。

體現在具體的**是在:

1、檢測是不是被用過,這裡引入used陣列

2、遞迴入口的for迴圈中,for (int i=0;i

全排列和全組合

所謂全排列,就是列印出字串中所有字元的所有排列。例如輸入字串abc,則列印出 a b c 所能排列出來的所有字串abc acb bac bca cab和cba。一般最先想到的方法是暴力迴圈法,即對於每一位,遍歷集合中可能的元素,如果在這一位之前出現過了該元素,跳過該元素。例如對於abc,第一位可以是...

全排列和全組合實現

所謂全排列,就是列印出字串中所有字元的所有排列。例如輸入字串abc,則列印出 a b c 所能排列出來的所有字串abc acb bac bca cab和cba。一般最先想到的方法是暴力迴圈法,即對於每一位,遍歷集合中可能的元素,如果在這一位之前出現過了該元素,跳過該元素。例如對於abc,第一位可以是...

全排列和全組合實現

記得 老趙之前在微博上吐槽說,有的人真是毫無長進,六年前某同事不會寫程式輸出全排列,昨天發郵件還是問我該怎麼寫,這時間浪費到我都看不下去了。那時候就很好奇全排列到底是什麼東西,到底有多難?今天覆習的時候終於碰到這題了,結果果然自己太渣,看了好久都沒明白,實現又是磕磕碰碰的。所以,就把它整理成筆記加深...