思路
01背包加状态压缩dp,dp[i][j]表示枚举到i的时候,状态是j的时候的方案数,dp[i][j&a[i]]+=dp[i-1][j]
.dp[i][j]+=dp[i-1][j];最后统计一下所有的方案数即可
AC代码
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int M=1<<20;
#define mod 100000000
int a[50];
int f[50][M];
int main(){
int T;
cin >> T;
for(int t=1;t<=T;t++){
int n,m;
memset(f,0,sizeof f);
cin >> n >> m;
for(int i=0;i<n;i++){
cin >> a[i];
}
f[0][0]=1;
for(int i=0;i<n;i++){
for(int j=0;j<M;j++){
f[i+1][j^a[i]]+=f[i][j];
f[i+1][j]+=f[i][j];
}
}
long long res=0;
for(int i=m;i<M;i++)res+=f[n][i];
cout << "Case #"<< t << ": " << res << "\n";
}
}