POJ 2531
2014-04-30 18:38
246 查看
思路:通过位运算来枚举集合,由于集合的互补性只需要枚举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); } }