题目链接:http://poj.org/problem?id=2531
题目描述:
题目大意就是说现有n个节点,(n<=20),每两个节点之间有个权重,现将n个节点分成两份,A和B,能够使得A中每个节点到B中每个节点的权重之和最大。
因为考虑到的是n<=20, 2^20不会超时,所以直接搜索即可,每个节点可能有两种状态,在A或者在B,求一个最大值即可。
<span style="font-size:18px;">#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std ;
int num1, res ;
int C[25][25], n ;
bool cc[25] ;
//
int cal(int a[]){
int tmp = 0 ;
if( num1 == 0 || num1 == n ) return 0 ;
for( int i = 1; i <= n; i++ ) cc[i] = true ;
for( int i = 0; i < num1; i++ ) cc[a[i]] = false ;
for( int i = 1; i <= n; i++ ){
if( cc[i] ){
for( int j = 0; j < num1; j++ ) tmp += C[i][a[j]] ;
}
}
return tmp ;
}
//
void dfs(int a[], int dep){
if( dep == n+1 ){
int tmp = cal(a) ;
//for( int i = 0; i < num1; i++ ) cout << a[i] << endl ;
//cout << "dasdddddddddddddddddddd" << endl ;
res = max(res, tmp) ;
return ;
}else{
a[num1++] = dep ;
dfs(a, dep+1) ;
num1-- ;
dfs(a, dep+1) ;
}
}
//
int main(){
/freopen("1234.txt", "r", stdin) ;
while( scanf("%d", &n) != EOF ){
for( int i = 1; i <= n; i++ ){
for( int j = 1; j <= n; j++ ){
scanf("%d", &C[i][j]) ;
}
}
num1 = res = 0 ;
int a[25], b[25] ;
dfs(a, 1) ;
cout << res << endl ;
}
return 0 ;
}</span>