题目链接:
题意:
你是一个黑客,侵入了n台计算机(每台计算机有同样的n种服务),对每台计算机,你能够选择终止一项服务,则他与其相邻的这项服务都终止。你的目标是让很多其它的服务瘫痪(没有计算机有该项服务)。
思路:(见大白70页,我的方程与大白不同)
把n个集合P1、P2、Pn分成尽量多的组,使得每组中全部集合的并集等于全集,这里的集合Pi是计算机i及其相邻计算机的集合,用cover[i]表示若干Pi的集合S中全部集合的并集,dp[s]表示子集s最多能够分成多少组,则
假设cover[s]=all,那么dp[s]至少为1.
dp[s]=max(dp[s],dp[s0]+dp[s^s0]); (两个子集的和)
代码:
#include#include #include #define N 16using namespace std;int n, m, x, dp[1<