#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 ;
}
lanqiao oj 186 糖果(状态压缩dp)
最新推荐文章于 2024-06-16 22:31:26 发布