【题意简述】:现在已知,你可以从键盘输入n,它代表着n个点,然后输入n个点之间的关系!就是那个邻接矩阵。邻接矩阵的每个值代表其点与点之间的权值!现在让我们把这些点分成两部分,使得这两部分的权值之和最大!每个部分之内的点与点之间权值算作0!
【思路】:我们可以试着先将这些点都放在一个部分里,然后再依次拿出这些点,放到另一个集合里,计算此时的权值之和!和之前计算的权值作比较,如果比之前大,就更新这个值!
详见代码:(code from:http://blog.csdn.net/martin31hao/article/details/8098302)
#include<iostream> using namespace std; const int Max = 21; const bool A = true; const bool B = false; int n, map[Max][Max], ans = 0; bool set[Max]; void dfs(int dep, int sum){ if(dep > n){ if(sum > ans) ans = sum; return; } int i, m; m = 0; set[dep] = A; for(i = 1; i <= dep; i ++) if(set[i] == B) m += map[i][dep]; dfs(dep + 1, sum + m); m = 0; set[dep] = B; for(i = 1; i <= dep; i ++) if(set[i] == A) m += map[i][dep]; dfs(dep + 1, sum + m); } int main(){ cin >> n; for(int i = 1; i <= n; i ++) for(int j = 1; j <= n; j ++) cin >> map[i][j]; dfs(1, 0); cout << ans << endl; return 0; }