HDU 5119 Happy Matt Friends(DP)

来源:互联网 发布:转发淘宝链接赚钱 编辑:程序博客网 时间:2024/06/03 07:57

题意:有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;}