zoukankan      html  css  js  c++  java
  • 1767运动员最佳匹配问题(搜索算法+剪枝)

    Description

    羽毛球队有男女运动员各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]。
    设计一个算法,计算男女运动员最佳配对法,使各组男女双方竞赛优势的总和达到最大。
    设计一个算法,对于给定的男女运动员竞赛优势,计算男女运动员最佳配对法,使各组男女双方竞赛优势的总和达到最大。

    Input

    输入数据的第一行有1 个正整数n (1≤n≤20)。接下来的2n 行,每行n个数。前n行是p,后n行是q。

    Output

    将计算出的男女双方竞赛优势的总和的最大值输出。

    Sample

    Input 

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

    Output 

    52

     1 #include <iostream>
     2 #include <string.h>
     3 
     4 using namespace std;
     5 
     6 int best[25], fit[25][25], book[25];
     7 int maxx;
     8 
     9 void dfs(int cur, int sum, int n)
    10 {
    11     if(cur==n+1) maxx = max(maxx, sum);
    12     else if(sum+best[n]-best[cur-1] <= maxx) return;
    13     else
    14     {
    15         int i;
    16         for(i=1;i<=n;i++)
    17         {
    18             if(book[i]==0)
    19             {
    20                 book[i] = 1;
    21                 dfs(cur+1, sum+fit[cur][i], n);
    22                 book[i] = 0;
    23             }
    24         }
    25     }
    26 }
    27 
    28 int main()
    29 {
    30     int n, i, j;
    31     int a[25][25], b[25][25];
    32     cin >> n;
    33     for(i=1;i<=n;i++)
    34     {
    35         for(j=1;j<=n;j++)
    36         {
    37             cin >> a[i][j];
    38         }
    39     }
    40     for(i=1;i<=n;i++)
    41     {
    42         for(j=1;j<=n;j++)
    43         {
    44             cin >> b[i][j];
    45         }
    46     }
    47     best[0] = 0;
    48     for(i=1;i<=n;i++)
    49     {
    50         best[i] = 0;
    51         for(j=1;j<=n;j++)
    52         {
    53             fit[i][j] = a[i][j] * b[j][i];
    54             best[i] = max(best[i], fit[i][j]);
    55         }
    56         best[i] += best[i-1];
    57     }
    58     memset(book, 0, sizeof(book));
    59     maxx = 0;
    60     dfs(1, 0, n);
    61     cout << maxx << endl;
    62     return 0;
    63 }
  • 相关阅读:
    【计算机网络】第三章 数据链路层
    【网页设计】第四周 JavaSript
    【计算机网络】第二章 物理层
    【计算机网络】第一章 概述
    [寒假学习]ps知识
    [蓝桥杯]算法提高 GPA
    用Java模拟游戏重力的实现(弹跳)
    【狼叔分享】狼叔20年上半年故事分享
    旷视教会我如何安装tensorflow环境|这才是真正的pip install tensorflow
    大学逆袭的三步骤:大三实习、大四秋招、大四春招
  • 原文地址:https://www.cnblogs.com/0xiaoyu/p/14100564.html
Copyright © 2011-2022 走看看