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 }