子集subset問題
子集即組合的集合
例如求ABCD的子集,即求ABCD中任取0個的情況+ABCD中任取1個的情況+ABCD中任取2個的情況+ABCD中任取3個的情況+ABCD中任取4個的情況。
遇到子集問題,首先想到暴力求法,即所有元素均有兩種情況:取或不取。
因此暴力求法可以使用四層for循環解決上述問題。
然而是否有更簡單的方法?
答案顯然是肯定的,即利用前面討論的位運算的方法。
爲何想到位運算的方法?因爲前面暴力求解的過程中,我們遇到了取或不取得抉擇,用計算機的頭腦來思考,即0,1問題。
好了,上述問題可以變爲下面的情況:
ABCD 總共情況爲2的4次方,即16種。
因此對應的整形數位0~15
將這16個數字寫成4位二進制數爲:
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
10 1010
11 1011
12 1100
13 1101
14 1110
15 1111
其中位爲1表示選擇該位對應的字符,例如1101對應ABCD,表示選取ABD。
當遇到棋盤類型的問題,格子比較少,一般32個格子以內,且表示方法只有0,1兩種的情況,適合轉換爲整形數,使用位運算,子集問題。