對於「採用二進位制列舉所有數目為k的子集」的一些理解

2021-10-11 11:12:32 字數 422 閱讀 6595

丟擲問題:假如我們遇到這樣乙個問題,給你n個元素,需要取出k個元素,問你有哪些取法?

對於有演算法基礎的同學一定會想到要用回溯,這個方法肯定是可行的,但是當n很大的時候怎麼辦呢?

進一步優化,我們可能要想到用二進位制列舉狀態的方式,相信有狀壓dp基礎的同學一眼就能看出。

不過在最近的周賽中我卻發現,無腦的列舉所有狀態,還是會浪費很多時間去檢視一些無效的狀態(二進位制表示中1的數量不為k),於是就去查詢更優的方法。

我們可以只列舉1的數量為k的所有狀態,這樣不就少遍歷了很多次了嘛,具體寫法如下【並將我的理解放在了注釋中】:

int comb = (1 << num) - 1; //(1).取出字典序最小的1的連續區間

while (comb < (1 << n))

二進位制列舉

fliptile 乙個反轉問題,大意是一頭牛要反轉木板,木板有黑和白,全部翻成白色的反法 輸出。小蒟蒻根本想不到 參考了大佬的部落格。點此轉入 把第一行的全部翻法都試一遍,然後看哪種的步數最少。好難想。include include int maze 20 20 int t 20 20 int f ...

二進位制列舉

一 二進位制操作 算數字運算 a 60 0011 1100 b 13 0000 1101 1.與 兩個二進位制數,同 1為 1,否則為 0。a b 12 0000 1100 2.或 兩個二進位制數,同 0為 0,否則為 1。a b 61 0011 1101 3.非 按位取反 對二進位制每一位進行了一...

二進位制列舉

讓我們從乙個題目入手 從乙個大小為n的整數集中選取一些元素,使得它們的和等於給定的值t。每個元素限選一次,不能乙個都不選。關於這個題目,我們很容易想到的便是對所有元素進行暴力搜尋,然後進行剪枝便可。下面我將介紹二進位制列舉的思路和流程來巧妙的解決這個問題。對任一數來說,所面臨的問題是取或不取,在二進...