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);
}
}
浙公网安备 33010602011771号