枚举子集
在学习steiner tree时曾经遇到这个问题,现在总结一下。
设S表示一个01状态集,那么它的所有非空子集x可以通过以下代码枚举。
for (int x = S; x; x = (x-1)&S)
比如S=1011,则x分别为:1011, 1010, 1001, 1000, 0011, 0010, 0001。忽略S中第二位的0其实就是111, 110, 101, 100, 011, 010, 001。
在学习steiner tree时曾经遇到这个问题,现在总结一下。
设S表示一个01状态集,那么它的所有非空子集x可以通过以下代码枚举。
for (int x = S; x; x = (x-1)&S)
比如S=1011,则x分别为:1011, 1010, 1001, 1000, 0011, 0010, 0001。忽略S中第二位的0其实就是111, 110, 101, 100, 011, 010, 001。