uva11825
Posted yohanlong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uva11825相关的知识,希望对你有一定的参考价值。
题意是将n个集合P1,P2,P3,……,Pn分成尽量多组,使得每组中所有集合的并集等于全集。
Pi是对于计算机i及其相邻计算机的集合。
每个组就相当于一项服务。
整个动规相当于对一个集合进行划分。
先去开会,一会儿补坑。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 16; int n; int p[maxn], cover[1 << maxn], f[1 << maxn]; int main() { int kase = 0; while (scanf("%d", &n) && n) { kase++; memset(p, 0, sizeof p); for (int i = 0; i < n; i++) { p[i] = 1 << i; int num; scanf("%d", &num); for (int j = 1; j <= num; j++) { int x; scanf("%d", &x); p[i] |= (1 << x); } } for (int S = 0; S < (1 << n); S++) { cover[S] = 0; for (int i = 0; i < n; i++) if (S & (1 << i)) cover[S] |= p[i]; } f[0] = 0; int ALL = (1 << n) - 1; for (int S = 1; S < (1 << n); S++) { f[S] = 0; for (int S0 = S; S0; S0 = (S0 - 1) & S) if (cover[S0] == ALL) f[S] = max(f[S], f[S ^ S0] + 1); } printf("Case %d: %d\n", kase, f[ALL]); } return 0; }
以上是关于uva11825的主要内容,如果未能解决你的问题,请参考以下文章
题解 $UVA$ 11825$Hackers$' $Crackdown$
UVA11825 Hackers' Crackdown(状压dp)