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))。