您的位置:首页 > 运维架构

bzoj 1688: [Usaco2005 Open]Disease Manangement 疾病管理 dfs

2016-11-23 20:06 441 查看

题意

给出n头牛和d种疾病,每一头牛都会有若干种疾病,问最多能选择多少头牛使得这些牛的疾病数不超过k。

n<=1000,k<=d<=15

分析

状压一下直接搜索选取哪些疾病然后O(n)扫一遍即可。

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define N 2005
using namespace std;

int a
,n,d,k,now,ans;

void dfs(int x,int y)
{
if (x>d||y==k)
{
int s=0;
for (int i=1;i<=n;i++)
if ((a[i]|now)==now) s++;
ans=max(ans,s);
return;
}
dfs(x+1,y);
now+=1<<(x-1);
dfs(x+1,y+1);
now-=1<<(x-1);
}

int main()
{
scanf("%d%d%d",&n,&d,&k);
for (int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
for (int j=1;j<=x;j++)
{
int y;
scanf("%d",&y);
a[i]|=1<<(y-1);
}
}
dfs(1,0);
printf("%d",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: