【题解】
题意:给定一个n,把2n个人分为两组,再给定一个2n*2n的方阵,aij表示当第i个人和第j个人不在一个组时将得到的武力值,要求你分配输出最大的武力值之和。
思路:n<=14,dfs跑一遍即可。
【代码】
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll a[30][30],d[30];
ll ans;
int n;
vector <int> vec;
void dfs(int pos,ll sum)
{
if(vec.size()==n){
ans=max(ans,sum);
return;
}
if(pos>2*n) return;
ll cou=d[pos];
for(int i=0;i<vec.size();i++)
cou-=2*a[pos][vec[i]];
vec.push_back(pos);
dfs(pos+1,sum+cou);
vec.pop_back();
dfs(pos+1,sum);
}
int main()
{
while(~scanf("%d",&n)){
ans=0;
for(int i=1;i<=2*n;i++)
for(int j=1;j<=2*n;j++)
scanf("%lld",&a[i][j]),d[i]+=a[i][j];
dfs(1,0);
printf("%lld\n",ans);
}
}
【题面】