乙個有 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 表示第...