运动员最佳匹配 回溯+剪枝 c++

题目

羽毛球队有男女运动员各n人. 给定2个n*n矩阵PQ. 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]]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值