子集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两种的情况,适合转换为整形数,使用位运算,子集问题。