https://vjudge.net/problem/HDU-5119
数组开的太大,要放在全局变量才可以。。(以后还是养成这个好习惯吧)
我开始想的是壮压,dp[i][j] i为用到某个数,j为压缩的 使用策略(总共才50位,谁用谁记录1)
最后遍历状态,统计结果。
tle,大概遍历结果最大为 2的50次方
并且递归时间较长。。
这道题我以前写过的。。。
如果哪位大佬壮压写过了可以交流哈。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
/*这道题以前写过。。竟然没看出来。
可见以前的学习是多么的敷衍。呜呼!
给定一群数,对这群数进行异或运算,问你有
多少种类能让这群数的异或和超过等于n
背包问题,统计数目。这种方面的题我想过写的
但是后来放弃了。
*/
const int maxn=1048600;
typedef long long ll;
long long dp[2][1048600];
int main()
{ int t;
int a[50];
//ll dp[2][maxn];
ll ans;
int bb;
int m,n;
scanf("%d",&t);
for(int tt=1;tt<=t;tt++){
scanf("%d%d",&m,&n);
bb=-1;
for(int i=1;i<=m;i++){
scanf("%d",&a[i]);
bb=max(a[i],bb);
}
ans=0;
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(int i=1;i<=m;i++){
for(int j=0;j<2*bb;j++){
dp[i%2][j]=dp[(i-1)%2][j]+dp[(i-1)%2][j^a[i]];
}
}
for(int i=n;i<2*bb;i++){
ans+=dp[m%2][i];
}
printf("Case #%d: %lld\n",tt,ans);
}
return 0;
}