思路:状压dp,枚举疾病的集合,然后判断一下可行性即可。
#include<bits/stdc++.h> using namespace std; #define maxs 400000 #define maxn 1900 int n,d,k; int a[maxn],f[maxs],num[maxs]; int main(){ scanf("%d%d%d",&n,&d,&k); for (int i=1;i<(1<<d);i++) num[i]=num[i>>1]+(i&1); for (int i=1,len;i<=n;i++){ scanf("%d",&len); for (int j=1,x;j<=len;j++) scanf("%d",&x),a[i]+=(1<<(x-1)); } int ans=0; for (int i=1;i<=n;i++) for (int j=(1<<d)-1;j>=0;j--) if (num[j|a[i]]<=k) f[j|a[i]]=max(f[j|a[i]],f[j]+1),ans=max(ans,f[j|a[i]]); printf("%d\n",ans); return 0; }
时间: 2024-10-23 09:11:59