#include<iostream> #include<algorithm> #include<cstring> using namespace std ; const int N = 21 ; int n , m , k ; int f[1<<N] ;//用二进制的方式表示状态 int kw[110] ;//每一包糖果的口味的表示方式 int main(){ cin >> n >> m >> k ; memset(f,-1,sizeof(f)) ; for(int i = 1 ; i <= n ; i ++){//预处理每一包的状态 int tmp = 0 ; for(int j = 1 ; j <= k ;j ++){ int x ; cin >> x ; tmp |= (1 << (x-1)) ; } f[tmp] = 1 ;//有现成的一包糖果可以用来吃所以直接这一包就够用了 kw[i] =tmp ; } for(int i = 0 ; i < 1 << m ; i ++){ if(f[i] == -1) continue ;//如果没有出现过这种i情况,那我们就不能对这种情况进行加包,也就是扩展 for(int j = 1 ; j <= n ; j ++){ int tmp = kw[j] ; //如果以前没出现过两个相交的情况 或者 当前的数量 大于 我们要更新的数量,那样就进行更新 if(f[i|tmp] == -1 || f[i|tmp] > f[i] + 1) f[i|tmp] = f[i] + 1 ; } } cout << f[(1 << m) -1] << endl ; }