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

来源:互联网 发布:python股票量化分析 编辑:程序博客网 时间:2024/05/21 14:01

题意

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

分析

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

代码

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#define N 2005using namespace std;int a[N],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;}
0 0
原创粉丝点击