日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

运动员最佳配对问题

發布時間:2023/12/3 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 运动员最佳配对问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

西安交大 軟件53 蔡少斐

題號:6_5

題目敘述:

羽毛球隊有男女運動員各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≤10)。接下來的2n行,每行n個數。前n行是P,后n行是Q。

?

輸出格式

將計算出的男女雙方競賽優勢的總和的最大值輸出。

輸入樣例

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

輸出樣例

52?

題目解答:

?????? 這道題目共有n!種配對情況,也就是相當于固定男運動員,然后對女運動員進行一次全排列,并求出對應的優勢之和的最大值,本題可以用回溯法,也可以用分支限界法,在使用分支限界法的時候,關鍵是在于設計上界函數。

?????? 在這里,我們把上界函數定義為:剩下的未配對的女運動員(不考慮男運動員配對情況下)所能達到的優勢最大值之和(記為r)與當前配對已達到的優勢(記為sum)之和。在程序里體現如下:


在一開始時候,r被初始化為:


其中maxout的定義為:


?????? 在使用分支限界法的時候,一旦有一個葉節點出來,那么就立即結束算法,因為最先出來的葉節點必定是最優解。

代碼實現:

#include<algorithm> #include<iostream> #include<queue> #include<vector> #include <cstdio> usingnamespace std; const int MAX = 20; int P[MAX][MAX]; int Q[MAX][MAX]; int maxout[MAX]; int n; structnode {int id;int sum;int r;int up;int *x; }; structcmp {bool operator()( node* a, node* b ){return(a->up < b->up);} }; voidsolve() {int ans= 0;priority_queue<node*,vector<node*>, cmp> que;node *E = new node();E->id =1;E->sum =0;E->r =0;E->up =0;for ( int i = 1; i <= n; i++ ){E->r += maxout[i];}E->up =E->r;E->x =new int[n + 1];for ( int i = 1; i <= n; i++ ){E->x[i] = i;}while ( E->id != n + 1 ){for ( int i = E->id; i <= n;i++ ){node* nE = new node();nE->id = E->id + 1;nE->x = new int[n + 1];for ( int t = 1; t <= n;t++ ){nE->x[t] =E->x[t];}nE->x[E->id] = E->x[i];nE->x[i] = E->x[E->id];nE->sum = E->sum +P[E->id][nE->x[E->id]] * Q[nE->x[E->id]][E->id];nE->r = E->r - maxout[E->id];nE->up = nE->sum + nE->r;que.push( nE );}if ( !que.empty() ){E= que.top();que.pop();}else {ans = 0;break;}}ans = E->sum;cout << ans << endl; }intmain() {cin >> n;for ( int i = 1; i <= n; i++ ){for ( int j = 1; j <= n; j++ ){cin >> P[i][j];}}for ( int i = 1; i <= n; i++ ){for ( int j = 1; j <= n; j++ ){cin >> Q[i][j];}}for ( int i = 1; i <= n; i++ ){int ma = 0;for ( int j = 1; j <= n; j++ ){ma = max( ma, Q[i][j] *P[j][i] );}maxout[i] = ma;}solve();return(0); }/** 3* 10 2 3* 2 3 4* 3 4 5* 2 2 2* 3 5 3* 4 5 1*/

運行結果:


總結

以上是生活随笔為你收集整理的运动员最佳配对问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。