一、二進制基礎
計算:主要有與&,或|,異或^等。
&:兩者均爲1則1,否則爲0
|:兩者均爲0則0,否則爲1
^:兩者相同即爲0,否則爲1
部分重要計算:
1.判斷數字x二進制第i位是否等於1
if(((1<<(i−1))&x)>0)
解釋:將1左移i-1位,即1在第i位上,將其與x進行與運算判斷是否大於0即判斷是否爲1
2.將數字x二進制第i位改成1
x=x|(1<<(i−1))
解釋:得到第i位的1,將其或運算
3.將數字x二進制最右邊的第一個1去掉
x=x&(x−1)
例如:集合中,二進制1010101即表示選取
引例:
“......提壺去打酒,遇店加一倍,遇花喝一斗。”
一共遇到5次店,10次花,酒正好喝完,求遇到酒和花的次數的組合可能數。
long long solve(){
int ans = 0;
for(int i = 0;i < (1<<14); i++) {
int tot_1 = 0;
int tot_0 = 0;
int num = 2;
for (int j = 0; j < 14; j++) {
if (i&(1<<j)) { // 判斷i從右數第j+1位是否爲1
tot_1++;
num = num*2;
}else {
tot_0++;
num = num - 1;
}
}
if(tot_1 == 5 && tot_0 == 9 && num == 1) {
++ans;
}
}
return ans;
}
二進制枚舉
要求實現:在N個數字中找不重複的數字,通過加法湊成X的方案數。
long long solve(int a[],int N,int X) {
int ans = 0;
for(int i = 0; i < (1<<N);i++) {
int num = 0;
for(int j = 0; j < N; j++) {
if(i&(1<<j)) {
num+=a[j];
}
}
if(num == X) ans++;
}
return ans;
}
狀壓DP:
在元素規模相對較小(20)且要表示每個元素取或者不取的時候,可以使用。
TSP問題(NP-完全):