题意就是把节点分成A、B两组,节点间距C给了,要求解分组的方法,使得∑Cij (i∈A,j∈B)最大。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <set>
#define MAX 25
using namespace std;
int a[MAX],b[MAX],map1[MAX][MAX],n;
int max1=0;
void cnt(int an,int bn)
{
int sum=0;
for(int i=0;i<an;i++)
for(int j=0;j<bn;j++)
sum+=map1[a[i]][b[j]];
if(sum>max1) max1=sum;
}
void dfs(int an,int bn,int i)
{
if(i==n+1){cnt(an,bn);return ;}
a[an]=i;
dfs(an+1,bn,i+1);
b[bn]=i;
dfs(an,bn+1,i+1);
}
int main()
{
while(scanf("%d",&n)>0)
{
max1=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&map1[i][j]);
dfs(0,0,1);
printf("%d\n",max1);
}
return 0;
}