子集subset问题

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

posted @ 2015-12-23 20:48  xfei.zhang  阅读(222)  评论(0编辑  收藏  举报