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);
}