#include<bits/stdc++.h>
using namespace std;
#define maxn 25
// n输入的数据大小
// maxval寻找最大竞争优势
// sum累加当前竞赛优势
int n, maxval, sum;
// p为男方搭配优势
// q为女方搭配优势
// f标记当前女方队员是否已经搭配
// res记录两个远动员搭配时的竞赛优势
int p[maxn][maxn], q[maxn][maxn], visited[maxn], res[maxn];
void dfs(int i)
{
// 所有队员都已经找到搭配,结束
if (i == n){
maxval = max(maxval, sum);
return ;
}
int j;
int sum2 = sum;
// 计算当前累计的竞赛优势剩余的最佳搭配能否超过
// 最大已找到的最大竞赛优势,如果不能,剪枝,结束递归
for(int j = i; j < n; j++){
sum2 += res[j];
}
if (sum2 < maxval){
return ;
}
for (int j = 0; j < n; j++){
//如果没有被标记,则说明当前女队员没有找到搭配,进行搭配
if (!visited[j]){
visited[j] = 1;
sum += p[i][j];
dfs(i+1);
visited[j] = 0;
sum -= p[i][j];
}
}
}
int main()
{
cin>>n;
memset(res, -1, sizeof(res));
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
cin>>p[i][j];
res[i] = max(res[i], p[i][j]);
}
}
for (int i = 0; i < n; i++){
for (int j = 0;j < n; j++){
cin>>q[i][j];
}
}
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
p[i][j] = p[i][j] * q[j][i];
res[i] = max(res[i], p[i][j]);
}
visited[i] = 0;
}
memset(visited, 0, sizeof(visited));
sum = 0;
maxval = -1;
dfs(0);
cout<<maxval<<endl;
return 0;
}
SDUTOJ 1767 - 运动员匹配问题
最新推荐文章于 2023-03-11 11:02:23 发布