您的位置:首页 > 其它

SSL2703 2017年8月16日提高组T2 疾病(dfs)

2017-08-17 10:57 609 查看

2017年8月16日提高组T2 疾病

Description

现在有n个人,m种病,每个人都患有若干种病。若从这些人中选出若干个人来,但选出来的人的患病集合中不超过k种病,问最多能选出多少个人。

Input

第一行三个整数n,m,k。

接下来n行,每行第一个整数s,表示第i个人患了s种病,接下来s个整数,表示第i个人患的病。

Output

一行一个整数,表示答案。

【数据规模与约定】

对于前30%的数据,1<=n<=10,1<=m<=10.

对于前100%的数据,1<=n<=1000,1<=m<=15,1<=k<=m.

分析:观察数据可以发现m很小,所以按m搜索就行啦。

代码

#include <cstdio>
#define maxn 1005
using namespace std;

int a[maxn][20],n,m,k,ans;
bool f[20];

int find()
{
int s=0;
for (int i=1;i<=n;i++)
{
bool fl=false;
for (int j=1;j<=a[i][0];j++)
if (!f[a[i][j]])
{
fl=true;
break;
}
if (!fl) s++;
}
return s;
}

void dfs(int dep,int tot)
{
if (tot==k)
{
int x=find();
if (x>ans) ans=x;
return;
}
if (dep>m) return;
f[dep]=true;
dfs(dep+1,tot+1);
f[dep]=false;
dfs(dep+1,tot);
}

int main()
{
//  freopen("disease.in","r",stdin);
//freopen("disease.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
for (int i=1;i<=n;i++)
{
scanf("%d",&a[i][0]);
for (int j=1;j<=a[i][0];j++)
scanf("%d",&a[i][j]);
}
if (m==k) ans=n;
else dfs(1,0);
printf("%d",ans);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: