POJ 2531

思路:通过位运算来枚举集合,由于集合的互补性只需要枚举2^(n-1)个集合。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int map[30][30];
int main(){
    int N, temp, flow, ans;
    //freopen("in.c", "r", stdin);
    while(~scanf("%d", &N)){
        for(int i = 1;i <= N;i ++){
            for(int j = 1;j <= N;j ++)
                scanf("%d", &map[i][j]);
        }
        ans = -1;
        for(int i = 1;i <= (1 << N-1);i ++){
            flow = 0;
            for(int j = 0;j <= 19;j ++){
                if(i & (1 << j)){
                    for(int k = 0;k <= 20;k ++){
                        if(!(i & (1 << k))) flow += map[j+1][k+1];
                    }
                }
            }
            ans = max(ans, flow);
        }
        printf("%d\n", ans);
    }
}


posted on 2014-04-30 18:38  wangzhili  阅读(105)  评论(0)    收藏  举报