Uva(11825)(hackerscrackdown)

链接:https://vjudge.net/problem/UVA-11825
思路:首先要把题意抽象出来,可以理解为题目给你n个集合,让你尽可能合并成多个集合,使得每个集合都是电脑的全集,最后集合数就是答案,那么我们可以考虑把题目给的每个集合都表示成一个二进制的数,然后求出这些集合的所有子集,f(s) = max(f(s0)+1(其中s0是s的子集且s和s0的差集是一个全集),接下来就可以用动态规划解决问题
附录:求所有i的子集:for(int j=i;j;j=(j-1)&i)

代码:

#include
#include
using namespace std;

int n,m,t;
int a[20];
int s[65660],f[65660],o=0;

int main(){
    while(cin>>n&&n){
        memset(a,0,sizeof(a));
        memset(s,0,sizeof(s));
        memset(f,0,sizeof(f));
        for(int i=0;i>m;
            a[i]+=(1<>t;
                a[i]|=(1<

你可能感兴趣的:(Uva(11825)(hackerscrackdown))