算法设计与分析: 5-4 运动员最佳配对问题

5-4 运动员最佳配对问题


问题描述

羽毛球队有男女运动员各 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;
    }
}

Input & Output

3
10 2 3
2 3 4
3 4 5
2 2 2
3 5 3
4 5 1
52

Reference

王晓东《计算机算法设计与分析》(第3版)P180

猜你喜欢

转载自blog.csdn.net/ioio_/article/details/81093965