二進位制列舉

2022-03-04 03:51:58 字數 1264 閱讀 2991

讓我們從乙個題目入手

從乙個大小為n的整數集中選取一些元素,使得它們的和等於給定的值t。每個元素限選一次,不能乙個都不選。

關於這個題目,我們很容易想到的便是對所有元素進行暴力搜尋,然後進行剪枝便可。

下面我將介紹二進位制列舉的思路和流程來巧妙的解決這個問題。

對任一數來說,所面臨的問題是取或不取,在二進位制中便可以用1或0來表示。由於每個數都會對應一串二進位制數字,那麼結果便有2n個狀態,如1000001便相對於取0號位元素和最後一號元素,其他元素不取。那麼我們可以列舉這2n個狀態,通過遍歷當前狀態的每一位來判斷,然後對取的元素求和判斷是否為乙個合格的狀態。

#include using namespace std;

#define ll long long

#define ld long double

const int maxn = 2005;

int a[maxn], n, t, cnt;

int main()

if(sum == t)//滿足條件記錄

cout << endl;

cnt++;//記錄合理數}}

cout << cnt << endl;

}

看完上面**,有些小夥伴就要問了,i&(1《那麼補充一波位運算的知識吧:

按位與運算子(&)

參加運算的兩個資料,按二進位制位進行「與」運算。

運算規則:0&0=0; 0&1=0; 1&0=0; 1&1=1;

即:兩位同時為「1」,結果才為「1」,否則為0

例如:3&5 即 0000 0011& 00000101 = 00000001 因此,3&5的值得1。

左移運算(<<)

a << b就表示把a轉為二進位制後左移b位(在後面添b個0)。例如100的二進位制為1100100,而110010000轉成十進位制是400,那麼100 << 2 = 400。可以看出,a << b的值實際上就是a乘以2的b次方,因為在二進位制數後添乙個0就相當於該數乘以2(這樣做要求保證高位的1不被移出)。

通常認為a << 1比a * 2更快,因為前者是更底層一些的操作。因此程式中乘以2的操作請盡量用左移一位來代替。注意:不要用於浮點數型別

最後,給出二進位制的基本模板

for(int i = 0; i < (1<}

printf("\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.非 按位取反 對二進位制每一位進行了一...

二進位制列舉

題目鏈結 題意 總共有3x3盞燈,每次切換乙個燈還會同時改變上下左右的燈,問想把燈全部開啟最少需要操作多少次 輸入 乙個3x3的矩陣 分析 操作順序對題目是不影響的,另外,操作奇數次等價於1次,偶數次等價於2次,也就是說最大操作次數是9次 分析題目我們可以發現題目資料規模並不大,可以暴力列舉,並且燈...