枚举子集

在学习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。

原文地址:https://www.cnblogs.com/riskyer/p/3228761.html