您的位置:首页 > 移动开发

HDU 5119 Happy Matt Friends(DP)

2017-07-22 19:47 330 查看
题意:有N个人,每个人有一个权值,挑选一些人并将他们的权值异或,求最后得到的值大于M的取法有多少种

思路:类似于背包,枚举的是异或的和,给定的数你可以选择放或者不放,dp[i][j]代表的是前
i 个数中选择k个异或的和为j。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll dp[2][1<<20];
int a[42];
int main()
{
int n, m, T;
scanf("%d", &T);
for(int kase = 1; kase <= T; kase++)
{
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++)
scanf("%d", &a[i]);
memset(dp, 0, sizeof(dp));
dp[0][0] = 1;
ll ans = 0;
for(int i = 1; i <= n; i++)
for(int j = 0; j < (1<<20); j++)
dp[i%2][j] = dp[(i-1)%2][j] + dp[(i-1)%2][j^a[i]];
for(int i = m; i < (1<<20); i++)
ans += dp[n%2][i];
printf("Case #%d: %I64d\n", kase, ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: