子集生成(增量構造法 位向量法 二進位制法)

2021-09-10 16:11:01 字數 1149 閱讀 8940

生成集合的子集

樣例輸入:

3樣例輸出:

00 1

0 1 2

0 1 2 3

0 1 3

0 20 2 3

0 31

1 21 2 3

1 32

2 33

一、增量構造法

#include

int a[20]

;void

sutset

(int n,

int a,

int cur)

printf

("\n");

int min = cur ? a[cur -1]

+1:0

;//得到上乙個子集中最大的元素,並加一

for(

int i = min; i < n; i++)}

intmain()

二、位向量法

#include

#include

int a[20]

;void

subset

(int n,

int a,

int cur)

}printf

("\n");

return;}

a[cur]=1

;subset

(n, a, cur +1)

;//選第cur個元素

a[cur]=0

;subset

(n, a, cur +1)

;//不選第cur個元素

}int

main()

三、二進位制法

分析:列舉各子集所對應的編碼0,1,2···,2^n

由於每個i都不同,那麼每個i代表的每個子集就不同,

以n=2為例,i可取0,1,2,3 二進位制表示00,01, 10, 11

分別代表的子集是:{},,,

#include

//列印的子集s

void

subset

(int n)

}printf

("\n");

}}intmain()

子集生成演算法 之 位向量法和增量構造法

演算法競賽經典入門中的解釋 給定乙個集合,列舉所有的可能的子集。位向量法 1.什麼是位向量法?通過構造乙個標記向量pd i 而不直接構造存放題目資料的子集a。當pd i true的時候,標記了了我們把資料集合中的第i個位置的資料放入乙個子集中,這一切都是通過標記陣列pd來實現的。2.原理圖 執行結果...

子集生成(位向量法)

今晚在劉汝佳的演算法競賽裡面學到了子集生成的位向量法,感覺這方法比較直觀,只要把遞迴理解好就ok了,下面是我在看了他的方法之後自己編的求子集的 拿出來和大家交流一下,多多指教。位向量法,當b i 1當且僅當i在子集中 include include using namespace std int b...

二進位制子集生成

之前看 演算法競賽入門經典 這本書,看到了子集生成部分,以為自己沒有看二進位制法。誰知整理部落格的時候發現很早之前就學習過了,然而我描述的不完整,看了半天沒看懂什麼意思,果然欠下的都是要還的。用二進位制表示子集,其中從右往左第i位 從0開始編號 表示元素i是否在集合中。在集合表示法中,1 i 表示第...