二進位制列舉 學習筆記

2021-10-02 16:59:00 字數 1477 閱讀 9715

紫書215頁暴力求解法裡面有一道題目(cutting chains uva - 818 )要用到二進位制列舉,所以學了一下;

總結來說就是對n個事件(n<32);每個事件都有兩種情況,所以可以用0和1來表示事件的發生和不發生,每個事件的序號又可以和二進位制位相對應,所以全部n事件的狀態,可以用1到2^n的數字的二進位制來表示;

然後根據乙個數的二進位制0和1的狀態來判斷是否符合條件,是乙個不錯的暴力演算法;

題目:這道題就是列舉每個圓環,每個圓環有兩種狀態,開和閉,然後根據每次列舉的狀態來判斷是否符合題目要求;

**:

#include

#define ll long long

#define pa pair

#define lson k<<1

#define rson k<<1|1

//ios::sync_with_stdio(false);

using

namespace std;

const

int n=

100100

;const

int m=

200100

;const ll mod=

1e9+7;

int n;

int ma[20]

[20],a[20]

[20];

int vis[20]

,d[20];

intsum

(int p)

return ans;

}void

dfs(

int p,

int q)}}

bool

judge

(int p)

memset

(vis,0,

sizeof

(vis));

memset

(d,0

,sizeof

(d))

;int b=

0,c=0;

//開啟的圓環數,剩餘的支鏈數

for(

int i=

0;ifor(

int i=

0;i(d[i]

>2)

return

false;}

}for

(int i=

0;ifor(

int i=

0;i(c-1

>b)

return

false

;return

true;}

intmain()

int ans=

1e9;

for(

int i=

0;i<(1

<;i++

)printf

("set %d: minimum links to open is %d\n"

,++c,ans);}

return0;

}

二進位制列舉

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。每個元素限選一次,不能乙個都不選。關於這個題目,我們很容易想到的便是對所有元素進行暴力搜尋,然後進行剪枝便可。下面我將介紹二進位制列舉的思路和流程來巧妙的解決這個問題。對任一數來說,所面臨的問題是取或不取,在二進...