HDU 5119 Happy Matt Friends【背包+位运算】

Source


题意:有N个数,从这些数中选一个或多个进行亦或运算,问一共有多少种选法使得最后的亦或结果大于给定的M。

思路:这道题要用dp,应该是比较容易想到的,其实就是一个背包问题
f(i,j)   代表用0号到i号这些数选一些亦或出来结果为j的方案数

状态递推式:

f(i,j)=f(i-1,j)+f(i-1,j^a[i])

其中之所以是j^a[i],是因为如果要选a[i]的话,j^a[i]^a[i]=j


代码如下:

#include<cstdio>
#include<string.h>

int f[45][2000000];
int main()
{
    int t,T,n,m,x;
    scanf("%d",&T);
    for(int t=1;t<=T;t++)
    {
        scanf("%d%d",&n,&m);
        memset(f,0,sizeof(f));
        scanf("%d",&x);
        f[0][0]=1;
        f[0][x]=1;
        for(int i=1;i<n;i++)
        {
            scanf("%d",&x);
            f[i][0]=1;
            for(int j=0;j<1048576;j++)
            f[i][j]=f[i-1][j]+f[i-1][j^x];
        }
        long long ans=0;
        for(int i=m;i<1048576;i++) ans+=f[n-1][i];
        printf("Case #%d: %lld\n",t,ans);

    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值