1、枚举n个节点组成的所有子集:
for(int i = 0; i < (1 << n); i++){
// 操作:
}
-
在每次循环中,i代表了当前的子集。通过
(1 << n)
,我们可以生成一个二进制数,其有n
位。这个二进制数表示了一个包含了全部n
个元素的子集。比如,如果n
为 3,那么(1 << n)
就等于 8,对应的二进制为1000
,表示包含了全部 3 个元素的子集。也就是从000 一直遍历到111,这其中包含了这三位数字组成的所有子集。
2、检查当前子集对应的二进制数字串的每一位:
for(int i = 0; i < n; i++){
if(((s >> i) & 1) == 0){
\\ 操作:
}
}
对子集s进行右移操作,从而检查每一个节点是否在当前子集中。