14回溯法—运动员最佳配对问题
问题描述:
羽毛球运动员男女各n人,给定两个n x n矩阵P、Q,P[i][j]是男i和女j组成的男运动员优势,Q[i][j]是女i和男j组成的女运动员优势,P[i][j]不一定等于Q[j][i],男i和女j组成的混合双打优势为P[i]][j]和Q[j][i],设计算法计算男女运动员最佳搭配法,使各组男女双方竞赛优势总和达到最大。
问题分析:
该问题输出为男女人员的搭配问题,由于运动员不能重复选择,因此此问题的解空间树是一个排列树,可以使用排列树回溯法模板进行算法设计。
下面考虑剪枝函数,因为当人员没有选完时,不确定最终结果是否优于最优解,所以回溯过程中不需要剪枝函数进行剪枝,只有当一条分支运行到叶子结点时,才需要判断可行解于最优解的关系,考虑是否更新最优解。
最后考虑输出结果,输出结果应该时是包含运动员编号的集合,用x[i]表示,原数组存放初始编号,经过算法处理后,输出符合最优值的编号。
算法设计:
#define n 10
int p[n + 1][n + 1], q[n + 1][n + 1];
int max, temp=0;
int r[n + 1];
void ball(int i) {
if (i > n) {
if (temp > max) {
max = temp;
for (int i = 1; i <= n; i++)
printf("%d", r[i]);
}
}
for (int j = i; j <= n; j++) {
swap(r[i], r[j]);
temp += p[j][r[j]] * q[r[j]][j];
ball(i + 1);
temp -= p[j][r[j]] * q[r[j]][j];
swap(r[i], r[j]);
}
}