1. 程式人生 > >枚舉子集&高位前綴和

枚舉子集&高位前綴和

strong 就是 代碼 比較 做的 二進制位 cpp span n)

最近做的題裏面有這個東西,於是寫一篇博客總結一下吧。

枚舉子集

枚舉子集就是狀壓的時候枚舉其中的二進制位中的1的子集。直接暴力枚舉二進制位時間復雜度是\(O(4^n)\),但是我們可以發現,對於每一位有以下三種狀態,在枚舉的子集中為1,在子集中為0且在原狀態中為1,以及在原狀態中為0。這樣,對於1到\(2^n\)的數中,子集的總數為\(3^n\),這樣,通過一些比較優秀的枚舉,時間復雜度即為\(O(3^n)\)。代碼如下:

for(int i=s;;i=(i-1)&s) {
    //do sth...
    if(!i) break;
}

其中,對於每次循環的i,枚舉的即是s的子集。

枚舉子集&高位前綴和