看到这个题分类在dfs里,但是完全没有思路。。。
看了下别人的博客。。
先将所有点放在一个集合里,然后取出一个点放在另一个集合里,对于在同一个集合里的点,减去他们两个之间的权
值,对于不在一个集合里的点,加上他们之间的权值。
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
bool vis[25];
int n;
int mp[25][25];
int Max;
void dfs(int st,int sum)
{
int sum1=sum;
vis[st]=1;
for(int i=0;i<n;i++)
{
if(vis[i])
sum1=sum1-mp[st][i];//i与st在用一个集合加上两点间的权
else
sum1=sum1+mp[st][i];//i与st在不同集合减去两点间的权
}
if(sum1>Max)
Max=sum1;//Max记录最大值
for(int i=st+1;i<n;i++)
{
dfs(i,sum1);
vis[i]=0;//回溯
}
}
int main()
{
while(~scanf("%d",&n))
{
memset(mp,0,sizeof(mp));
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&mp[i][j]);
Max=-99999999;
dfs(0,0);
printf("%d\n",Max);
}
return 0;
}