题目
羽毛球队有男女运动员各n人. 给定2个n*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]
. 设计一个算法, 计算男女运动员最佳配对法, 使得各组男女双方竞赛优势的总和达到最大.
数据输入: 第1行有一个正整数n(1<=n<=12), 接下来2n行是P和Q
结果输出: 最佳配对的各组男女双方竞赛优势总和
测试样例:input
3
10 2 3
2 3 4
3 4 5
2 2 2
3 5 3
4 5 1
output:
52
题解
采用排列树的回溯模型
初始x[i]=i
backtrack(int t) //搜索树的第t层
1. 若 t>n, 判断 记录 返回 //n为树的最大层数
2. 对 i = t : n
3. | 交换 x[t] 和 x[i]
4. | 若 满足 Constraint(t) 且 Bound(t) //约束和限界条件
5. | 则 backtrack(t+1);
6. | 交换 x[t] 和 x[i]
-
算法一:
套用上述模型,暂时不考虑约束和限界条件(会增加消耗的时间,不会影响结果的正确性)
这里只给出主函数,初始化等操作并未给出。
void Backtrack(int t)//搜索第t层 { /* n 最大层数,即题干中的n * cc 搜索这一层为止所得到的优势总和,即配对前t位运动员得到的优势,初值为0 * best 最大优势 初值为0 */ if (t > n) { if(cc > best) best=cc;}//搜索到树的最后一层后更新最大优势 else { for(int j = t; j <=n;j++) { swap(r[t],r[j]); cc+=p[t][r[t]]*q[r[t]][t]; //增加一次配对得到的优势 Backtrack( t+1); //搜索下一层 cc-=p[t][r[t]]*q[r[t]]