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 }
原文地址:https://www.cnblogs.com/0xiaoyu/p/14100564.html