【题解】
题意:给定一个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);
}
}
【题面】


DFS解决最大武力值问题
本文介绍了一个使用深度优先搜索(DFS)算法解决的问题,该问题要求将2n个人分成两组,并最大化组间成员的武力值总和。通过预计算每个人单独分配到一组时的贡献值并递归地尝试所有可能的分组方式,最终找到最优解。
F:Partition problem(dfs)&spm=1001.2101.3001.5002&articleId=96631342&d=1&t=3&u=23836ed12b884234b6306ea2ad2f6170)
651

被折叠的 条评论
为什么被折叠?



