如题:http://poj.org/problem?id=2531
题目要求给出一个n*n的矩阵,要求输出任意分割成2部分,连接边的最大值。
DFS(x,sum)将点x加入集合,并求出这时的sum,如果》max,更新,然后搜索图中有x的所有子问题。
#include<cstdio>
#include<cstring>
#define N 105
//元素要么加入集合,要么不加入集合
int a[N][N];
int n;
int set[N];
int max=0;
void DFS(int x,int sum) //将x加入集合看和是多少。第一次加入节点0,然后加入节点1-n-1.
{
set[x]=1;
int i;
for(i=0;i<n;i++)
if(set[i])
sum-=a[i][x];
else
sum+=a[i][x];
if(sum>max)
max=sum;
for(i=x+1;i<n;i++) //求出所有的组合,类似组合数
{
DFS(i,sum);
set[i]=0; //回溯
}
}
int main()
{
//freopen("C:\\1.txt","r",stdin);
scanf("%d",&n);
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
DFS(0,0);
printf("%d\n",max);
return 0;
}