打了个状压,40分,而且还是压缩的 m 。
打的刷表。
#include<cstdio>
inline int read()
{
register int ret = 0;
register bool f = 1;
register char ch = getchar();
while (ch < '0' || ch > '9')
(ch == '-') ? f = 0 : 0, ch = getchar();
while (ch >= '0' && ch <= '9')
ret = (ret << 1) + (ret << 3) + (ch ^ 48), ch = getchar();
return f ? ret : -ret;
}
int kw[109][29];
int dp[(1 << 20) + 9];//考虑口味选择
int vis[29];
#include<cstring>
int main()
{
register int n = read(), m = read(), k = read(), i, j, ans = 0, c, x;
for (i = 1;i <= n;++ i)
for (j = 1;j <= k;++ j)
x = read(), kw[i][x] = 1, ans += vis[x] ^ 1, vis[x] = 1;
if (ans != m)
{
puts("-1");
return 0;
}
for (i = 1;i < (1 << m);++ i)
dp[i] = 1e9;
for (i = 0;i < (1 << m);++ i)
{
for (j = 1;j <= n;++ j)//选择买哪个
{
x = i;
for (c = 1;c <= m;++ c)
if (kw[j][c])//有糖果c
x = x | (1 << (c - 1));
if (dp[x] > dp[i] + 1)
dp[x] = dp[i] + 1;
}
}
printf("%d", dp[(1 << m) - 1]);
return 0;
}