1. 程式人生 > >BZOJ 3687: 簡單題(dp+bitset)

BZOJ 3687: 簡單題(dp+bitset)

.com 枚舉 problem using 當前 lin 思路 \n amp

傳送門

解題思路

  設\(f(i)\)表示和為\(i\)時的方案數,那麽轉移方程為\(f(i)+=f(i-x)\)\(x\)為當前枚舉到的數字,這樣做是\(O(n\sum a_i)\)的,考慮優化。發現最後要的並不是方案數,最後的奇偶性,那麽轉移方程轉化為\(f(i)^=f(i-x)\),這樣可以用\(bitset\)優化,時間復雜度\(O(\frac{n \sum a_i}{32})\)

代碼

#include<iostream>
#include<cstdio>
#include<bitset>

using namespace std;
const int N=2000005;

int n,sum,ans;
bitset<N> f;

int main(){
    scanf("%d",&n); int x;
    f[0]=1;
    for(int i=1;i<=n;i++) {
        scanf("%d",&x); sum+=x;
        f=(f^(f<<x));
    }
    for(int i=1;i<=sum;i++)
        if(f[i]) ans^=i;
    printf("%d\n",ans);
    return 0;   
}

BZOJ 3687: 簡單題(dp+bitset)