子集和全排列問題

2021-06-18 02:36:27 字數 2615 閱讀 2892

列出所有子集(採用列出2進製數的方法)

問題描述:列出給定集合的所有子集合,包括空子集。

思路:乙個集合的所有子集合的個數是

11111 01111

+                 1

--------------------

11111 10000

當這個數加1時,如果當前位是1,那麼當前位就變成0並且向前進1位;接著前一位如果是1,也會變成0並且繼續進製;以此類推,直到遇到當前位是0的情況,就變成1,然後整個加法就完成了。依照此思路,很容易寫出**。

#include 

#include 

#define max 1000

int n=4;

// the number of the set elements

intset

[max]=;

int path[max]=;

int count=1;

//prototype

void print_set();

int main(

)\n"

,count)

;for

(index=0;index

}count++;

printf(

"%d:

return 0;

}void print_set(

)printf(

"}\n");

} 參考資料:《c語言名題精選百則技巧篇》

問題描述:寫乙個程式,用字典順序把乙個集合的所有子集找出來。

此題的思路來自《c語言名題精選百則技巧篇》:字典順序,也就是字串比較時的順序規則。可以採取這樣的思路

先定義n是集合的個數並且集合是已經從小到大排好順序的的集合。集合從開始(此時下標index=0),

1.當state[i]

2.當state[index]==n時,就不能向右邊進行擴充套件了,此時就需要向左邊處理了。此時的集合是,那麼,要找比這個集合剛好大一點的,就是,所以就可以歸納出規則為:將index減1並且將state[index]加1。

3.如果state[0]==n,那麼迴圈就結束,反之則重複第1,2步,直到state[0]==n。

**如下:

1 #include 2

#define max 100034

intmain()5;

8int index=0;9

int count=2

;10 printf("

1:{}\n2:\n");

11while(set[0]!=n)

1218

else

1923

inta_index;

24 count++;

25 printf("

%d:\n");

29}30return0;

31 }

12345

1235

1241245

12513

1341345

13514

14515

2        子集不是全排列

參考資料:《c語言名題精選百則技巧篇》

產生全排列問題

[cpp]view plain

copy

//全排列的遞迴實現

#include 

#include 

void

swap(

char

*a, 

char

*b)  

//k表示當前選取到第幾個數,m表示共有多少數.

void

allrange(

char

*pszstr, 

intk, 

intm)  

else

}  }  void

foo(

char

*pszstr)  

intmain()  

當然,這還缺少遞迴的終止條件(以上面來看是永運不會停止的);不過這很簡單,當 遞迴呼叫時,若l到r之間至少有3個元素,就做下去,而當只有兩個元素時就不必遞迴 呼叫了,此時接下來的兩步正好就是兩個元素的排列(兩個元素的排列只有兩種,一種是 輸入,另一種是兩個元素互換——反過來排)。由此,遞迴韹序就可以寫出來,這就是程式 permu—lr.c。

【問題實現】

c**  

#include 

#include 

#define  loop         1

#define  swap(a,b)    

#define  reverse(a,b)   

#define  display(n)     

void  again(int  perm, int l, int r)  

if (i > l )   

else

break;  

}  }  

void permut(int perm, int n)  

#define    maxsize   20

void main(void)  

python全排列和子集

獲取全集 def get all set list,cur 0 global result2 if cur len result2 print result2 return for each in list if each not in result2 cur 如果下乙個元素不在前面已經出現的元素裡...

全排列 全排列ii 子集 子集ii

2 全排列ii 3 子集 4 子集ii 5 資料排列 解題步驟 首先,要通過讀題完成下面三個步驟 1 描述解的形式,定義乙個解空間,它包含問題的所有解。2 構造狀態空間樹。3 構造約束函式 用於殺死節點 標準回溯模板 回溯演算法,複雜度較高,因為回溯演算法就是暴力窮舉,遍歷整顆決策樹是不可避免的 r...

求子集 全排列

求子集 給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集 冪集 說明 解集不能包含重複的子集。示例 輸入 nums 1,2,3 輸出 3 1 2 1,2,3 1,3 2,3 1,2 思路 1 確定乙個tags標記陣列,用於確定某個元素是否被選擇 2 確定遞迴的終止條件為 確定元素是...