运动员最佳配对问题

问题描述
羽毛球队有男女运动员各 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≤20)。接下来的 2n 行,每 行 n 个数。前 n 行是 p,后 n 行是 q。

Java
package Chapter5HuiSuFa;

import java.util.Scanner;

public class YunDongYuanZuiJiaPeiDui {

private static int n;
private static int[][] p,q;

private static int[] r;
private static int best;

public static void main(String[] args){
    Scanner input = new Scanner(System.in);

    while (true){
        best = 0;

        n = input.nextInt();

        p = new int[n+1][n+1];
        q = new int[n+1][n+1];
        r = new int[n+1];

        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
                p[i][j] = input.nextInt();

        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
                q[i][j] = input.nextInt();

        for(int i=1; i<=n; i++)
            r[i] = i;

        backtrack(1);

        System.out.println(best);
    }
}

private static void backtrack(int t){
    if(t > n) compute();
    else
        for (int j=t; j<=n; j++){
            swap(r,t,j);
            backtrack(t+1);
            swap(r,t,j);
        }
}

private static void compute(){
    int temp = 0;
    for(int i=1; i<=n; i++)
        temp += p[i][r[i]] * q[r[i]][i];
    if(temp > best)
        best = temp;
}

private static void swap(int[] x, int i, int j){
    int tmp;
    tmp = x[i];
    x[i] = x[j];
    x[j] = tmp;
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值