C 二進位制法生成子集

2021-10-10 04:18:51 字數 1341 閱讀 3045

乙個有 n 個元素的集合 (n >=0,n為整數),可以生成 2^n個子集。例如 可以生成4個子集    、,

二進位制法就是 從0到 2^n用二進位制表示,為1的對應的陣列位置元素 納入子集集合。

例如   a =   有 16 個子集,建立如下表

十進位制數

二進位制數

1對應的陣列元素

結果集0

0000空1

0001

a[3]d2

0010

a[2]c3

0011

a[2], a[3]

c,d4

0100

a[1]b5

0101

a[1],a[3]

b,d6

0110

a[1],a[2]

b,c7

0111

a[1],a[2],a[3]

b,c,d

81000

a[0]a9

1001

a[0],a[3]

a,d10

1010

a[0],a[2]

a,c11

1011

a[0],a[2],a[3]

a,c,d

121100

a[0],a[1]

a,b13

1101

a[0],a[1],a[3]

a,b,d

141110

a[0],a[1],a[2]

a,b,c

151111

a[0],a[1],a[2],a[3]

a,b,c,d

/**

* 獲取所有子集

* @tparam elemtype 返回值型別

* @tparam _inputiterator 線性表的迭代器型別

* @param _first1 線性表的起始位址

* @param _last1 線性表的結束位址

* @param _null 用變數來指定返回值型別避免編譯不過

* @return 所有子集

*/templatevector> makesubset(_inputiterator _first1, _inputiterator _last1, elemtype _null );

string string1;

vector>aaret= makesubset(aaaa, aaaa + 3, string1);

for (int j = 0; j < aaret.size(); ++j)

cout<<"}\n";

}}

{}

非空子集的生成(二進位制法)

假如有乙個n個元素的集合,那麼它的非空子集有2的次方 1個,而乙個n位的二進位制數除去0剛好可以表示2的n次方 1種狀態。剛好可以建立對應的聯絡,因此只需要檢測二進位制數所表示的每一種狀態1的位置,把對應位置的角標對應的元素新增到集合中即可 一種狀態對應乙個集合 最後在把集合新增到容器中便可求出所有...

技巧 二進位制法列舉子集

我們來看乙個可以用二進位制列舉的方法解決的題目 話說大詩人李白,一生好飲 幸好他從不開車 一天,他提著酒壺,從家裡出來,酒壺中有酒兩斗 他邊走邊唱 無事街上走,提壺去打酒 逢店加一倍,遇花喝一斗 這一路上,他一共遇到店 5 次,遇到花 10 次,已知最後一次遇到的是花,他正好把酒喝光了 請你計算李白...

二進位制子集生成

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