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

2021-07-24 14:13:19 字數 1465 閱讀 6717

演算法競賽經典入門中的解釋:給定乙個集合,列舉所有的可能的子集。

位向量法

1.什麼是位向量法?

通過構造乙個標記向量pd[i],而不直接構造存放題目資料的子集a。

當pd[i]==true的時候,標記了了我們把資料集合中的第i個位置的資料放入乙個子集中,這一切都是通過標記陣列pd來實現的。

2.原理圖

}執行結果:

優點:

缺點:

增量構造法

1.什麼是增量構造法

在一次操作中盡量準確從集合a中,篩選出乙個符合我們設定條件的元素,並放入乙個新的集合中,構造乙個子集b。

2.原理圖

int k1[10];//存放具體資料

int pos[10];//存放每次查詢下乙個元素的在集合k1中元素的具體位置

void add_cl (int cur)//從一定程度上,我們可以這麼理解cur引數:即cur是我們進行圖的遍歷的層數

else

*/ for (int i=dingwei;i>n)

add_cl (0);

} return 0;

}優點:

缺點:

我們舉乙個例子:

當我們設定條件,比如:我想要包含兩個元素的子集

我們的**就可以這麼書寫:

#include#includeusing namespace std;

int n;

int k1[10],pos[10];

void cl (int cur)

memset(pos,false,10);

cout<

子集生成(位向量法)

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

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

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

子集生成之增量構造法 允許有重複元素

假設集合s中有n個元素,它的子集的元素個數可以為1至n個,這個問題等價於有n個桶,按順序擺好並編號0 n 1,然後我們依次走到這n個桶面前,此時我們可以決定不放元素,或者放乙個元素,因為集合是無序的 集合和相同 所以我們可以事先將s中的元素排序,這樣我們走到編號為step的桶前只需考慮是否放入乙個s...