题意:有N头奶牛,D种疾病,已知每头奶牛都得了哪几种疾病.现在要选出尽可能多的奶牛,使得这些奶牛所带的疾病种类不大于K种,问最多能选几只.
分析:D<=15,N<=1000,考虑暴力枚举疾病种类的组合,O(N)求出可以入选的奶牛数.
因为有K的限制,枚举的复杂度最多为C(D,D/2)只有6000多.位运算优化下,居然79MS.
code:
var dis:array[0..1001] of longint;
n,d,k,i,j,l,di,tmp,ans:longint;
function lowbit(x:longint):longint;
begin
exit(x and (x xor (x-1)));
end;
function count(x:longint):longint;
begin
count:=0;
while x>0 do
begin
inc(count);
dec(x,lowbit(x));
end;
end;
begin
readln(n,d,k);
for i:=1 to n do
begin
read(di);
for j:=1 to di do
begin
read(l);
dis[i]:=dis[i]+1<<(l-1);
end;
readln;
end;
for di:=0 to 1<<d-1 do
if count(di)=k then
begin
tmp:=0;
for i:=1 to n do
if dis[i] or di=di then inc(tmp);
if tmp>ans then ans:=tmp;
end;
writeln(ans);
end.