生成集合的子集
樣例輸入:
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 表示第...