技巧 列舉子集的飄逸寫法

2021-07-24 02:51:34 字數 472 閱讀 3739

設s表示乙個01狀態集,那麼它的所有非空子集x可以通過以下**列舉。

for (int x = s; x; x = (x-1)&s)
簡單說明下原理(證明以後補上?):

x = (x-1)&s實際上是把s中的0全部忽略,並不斷減1的結果,比如s=1011,則x分別為:1011, 1010, 1001, 1000, 0011, 0010, 0001。忽略s中第二位的0其實就是111, 110, 101, 100, 011, 010, 001。

稱s中的1所在位為有效位,0所在位為無效位,則x中的無效位必為0,有效位為0或1,比如s=1011,x=1001(有效位加下劃線)。-1就是加上-1補碼1111…,可以想成把無效位的1先加上去,比如x=1001變成1101,再加有效位的1。由於無效位加完肯定是1,會把有效位的進製「傳遞」下去,然後再位與s使得無效位變成0,實際就相當於有效位加上1111…,也就是有效位-1。

**

Greetings (列舉子集 dp)

題目 題意 給n個信 信封有長寬和數目 問在找最多k種信封型別的時候,最少浪費多少紙 思路 看了看題解,深以為然,這個思路很巧妙,也許是我太菜,沒細想。我們首先二進位制列舉計算出,每種狀態下,這些信合用同一種信封時的浪費數目。然後通過列舉子集,dp i j 代表 i 種信封,現在已經裝了 j 集合的...

馬的管轄 列舉子集

在中國象棋中,馬是走日字的。乙個馬的管轄範圍指的是當前位置以及一步之內能走到的位置,如果一匹馬的某個方向被蹩馬腳,它就不能往這個方向跳了。自行腦補 那麼問題來了,在乙個 n m 的棋盤內,如何用最少的馬管轄住所有 n m 個格仔。比如 n m 3 時,最少要用 5 隻馬才能管轄所有棋盤,一種可能的方...

技巧 二進位制法列舉子集

我們來看乙個可以用二進位制列舉的方法解決的題目 話說大詩人李白,一生好飲 幸好他從不開車 一天,他提著酒壺,從家裡出來,酒壺中有酒兩斗 他邊走邊唱 無事街上走,提壺去打酒 逢店加一倍,遇花喝一斗 這一路上,他一共遇到店 5 次,遇到花 10 次,已知最後一次遇到的是花,他正好把酒喝光了 請你計算李白...