for(int sub = S; sub; sub =(sub -1)& S){// sub 为 S 的子集}
【证明】 由 sub=(sub−1)∩S 可知 sub 每次必然会变小,于是我们只需要证明区间 ((sub−1)∩S,sub) 中不存在 S 的子集。设 sub=(d1d2⋯dk10⋯0)2,那么 sub−1=(d1d2⋯dk01⋯1)2,由于 sub 是 S 的子集,则 (d1d2⋯dk00⋯0)2 是 S 的子集,因此考虑 (d1d2⋯dk01⋯1)2∩S,得到的一定是 ((d1d2⋯dk00⋯0)2,(d1d2⋯dk10⋯0)2) 中值最大的子集,问题得证。
【时间复杂度】 枚举单个状态的子集复杂度为 O(2m)(m 为 S 中 1 的个数)。考虑枚举全集 2n−1 的每个子集的子集的时间复杂度:O(i=0∑n(Cni⋅2i))=O((1+2)n)=O(3n)(二项式定理:(1+x)n=i=0∑n(Cni⋅xi))。