题目大意:有n个网络节点需要交换数据, 给出这n个节点相互交换数据的花费, 把这n个节点划分成两个子网, 子网内交换数据花费为零, 求划分成两个子网后最大的开销是多大。
解题思路:思来想去没有什么好办法, 一开始以为是个贪心或者dp, 但是不好记忆, 暴力可以。因为是分为两组, 可以分为0组和1组, 那么最大有二十台节点, 那么用二进制即可保存。 对于每种情况计算出开销, 保存最大值即可
剪枝:由于 1101 和 0010 是一样的, 因此不需要重复搜索, 当有四个节点的时候我们只需要搜到 0 1 1 1 就可以了 下一个是 1 0 0 0 就与前面重复了。
代码:
#include <iostream>
#include <cstdio>
using namespace std;
int n;
int W[25][25];
int main()
{
while(~scanf("%d", &n))
{
for(int i=1; i<=n; ++i)
for(int j=1; j<=n; ++j)
scanf("%d", &W[i][j]);
int M = (1 << n)-1;
int ans = 0;
int a = 0, b = 0;
int A[25], B[25];
for(int i=1; i<M; ++i)
{
a = b = 0;
for(int j=0; j<n; ++j)
if(1 & (i >> j)) A[a++] = j+1;
else B[b++] = j+1;
int cur = 0;
for(int j=0; j<a; ++j)
for(int k=0; k<b; ++k)
cur += W[A[j]][B[k]];
ans = max(ans, cur);
}
printf("%d\n", ans);
}
return 0;
}