题意:
把矩阵的点分为两部分,使得这两部分的权值和最大
思路:
将所有点放在一起,再重新组合
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
int mp[25][25];
int vis[25];
int dis[25];
int sum=0;
int ans=0;
int n;
void dfs(int x,int len)
{
vis[x]=1;
int tmp=len;
for(int i=1;i<=n;i++)
{
if(vis[i]==0)
tmp+=mp[x][i];
else
tmp-=mp[x][i];
}
sum=max(sum,tmp);
for(int i=x+1;i<=n;i++)
{
dfs(i,tmp);
vis[i]=0;
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&mp[i][j]);
int len=0;
dfs(1,0);
cout<<sum<<endl;
return 0;
}
/*
4
0 20 30 40
20 0 40 50
30 40 0 50
40 50 50 0
*/