1.HDU5119 简单dp+滚动数组
链接: 地址
题意:有N个人,每个人有一个权值,挑选一些人人并将他们的权值异或,求最后得到的值大于M的取法有多少种?
code:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1<<21;
long long a[maxn];
long long dp[4][maxn+7];
int t;
int main()
{
cin>>t;
int id =0;
while(t--)
{
int n,m;
cin>>n>>m;
memset(dp,0,sizeof dp);
dp[0][0] = 1;
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
{
for(int j=0;j<maxn;j++)
{
dp[i%2][j]=dp[(i-1)%2][j]+dp[(i-1)%2][j^a[i]];
}
}
long long ans =0 ;
for(int i=m;i<maxn;i++)
ans+=dp[n%2][i];
id++;
cout<<"Case #"<<id<<": "<<ans<<endl;
}
return 0;
}
2: