【动态规划】[UVa 11825]Hackers' Crackdown
这道题目用DP来搞首先题目可以看成把所有的计算机分成很多组每一组的都关闭同一种服务,同时这一组的关闭能够关闭所有的计算机,那么另
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAXN = 16;
int P[MAXN+10], cover[(1<<MAXN)+1], n, m;
void GetaCover(int S){
int tmp = S, t=0;
cover[S] = 0;
while(S){
if(S & 1)
cover[tmp] |= P[t];
S >>= 1;
t++;
}
}
bool Read(){
int t;
scanf("%d", &n);
if(n == 0) return false;
for(int i=0;i<n;i++){
scanf("%d", &m);
P[i] = 1 << i;
for(int j=0;j<m;j++){
scanf("%d", &t);
P[i] |= (1 << t);
}
}
t = 1 << n;
for(int i=0;i<t;i++)
GetaCover(i);
return true;
}
int f[(1<<MAXN)+2];
int solve(){
int Max = 1 << n;
for(int S=0; S<Max; S++){
f[S] = 0;
for(int S0=S; S0; S0=(S0-1)&S)
f[S] = max(f[S], f[S-S0]+int(cover[S0]==(Max-1)));
}
return f[Max-1];
}
int main(){
int cas = 0;
while(Read()){
printf("Case %d: %d\n", ++cas, solve());
}
return 0;
}