糖果店的老板一共有M种口味的糖果出售。为了方便描述,我们将M种口味编号1∼M。小明希望能品尝到所有口味的糖果。遗憾的是老板并不单独出售糖果,而是K颗一包整包出售。幸好糖果包装上注明了其中K颗糖果的口味,所以小明可以在买之前就知道每包内的糖果口味。
给定N包糖果,请你计算小明最少买几包,就可以品尝到所有口味的糖果。
输入
第一行包含三个整数N、M 和K。 接下来N 行每行K 这整数T1,T2,..TK ,代表一包糖果的口味。
输出
一个整数表示答案。如果小明无法品尝所有口味,输出−1
样例
输入
6 5 3 1 1 2 1 2 3 1 1 3 2 3 5 5 4 2 5 1 2
输出
2
提示
对于30%的评测用例,1≤N≤20。 对于所有评测样例,1≤N≤100, 1≤M≤20,1≤K≤20, 1≤Ti≤M。
———————————————————————————————————————————
代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,k;
int dp[1<<22],kw[100000];
int main()
{
cin>>n>>m>>k;
for(int i=1;i<(1<<m);i++)
dp[i]=-1;
for(int i=1;i<=n;i++)
{
int temp=0;
for(int j=1;j<=k;j++)
{
int a;
cin>>a;
temp|=(1<<(a-1));
}
kw[i]=temp;
dp[temp]=1;
}
for(int i=1;i<(1<<m);i++)
{
if(dp[i]!=-1)
{
for(int j=1;j<=n;j++)
{
int temp=kw[j];
if(dp[i|temp]==-1)
dp[i|temp]=dp[i]+1;
dp[i|temp]=min(dp[i|temp],dp[i]+1);
}
}
}
cout<<dp[(1<<m)-1];
return 0;
}