動態規劃 狀壓DP

一、二進制基礎

計算:主要有與&,或|,異或^等。

&:兩者均爲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)

例如:集合\begin{Bmatrix} 0,1,2,3,4,5,6 \end{Bmatrix}中,二進制1010101即表示選取\begin{Bmatrix} 0,2,4,6 \end{Bmatrix}

 

引例:

“......提壺去打酒,遇店加一倍,遇花喝一斗。”

一共遇到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-完全):

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章