運動員最佳配對問題

2021-08-02 11:30:44 字數 2337 閱讀 6409

西安交大 軟體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。

輸出格式

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

輸入樣例

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#include#include#include#include usingnamespace std;

const int max = 20;

int p[max][max];

int q[max][max];

int maxout[max];

int n;

structnode ;

structcmp

};voidsolve()

e->up =e->r;

e->x =new int[n + 1];

for ( int i = 1; i <= n; i++ )

while ( e->id != n + 1 )

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() )

else

}ans = e->sum;

cout << ans << endl;}

intmain()

}for ( int i = 1; i <= n; i++ )

}for ( int i = 1; i <= n; 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

*/

執行結果:

運動員最佳配對問題

這道題可以看為排列數的乙個典型模組 一 演算法實現題 1 問題描述 羽毛球隊有男女運動員各n人,給定2個n n矩陣p和q。p i j 是男運動員i和女運動員j配對組成混合雙打的男運動員競賽優勢 q i j 則是女運動員i和男運動員j配合的女運動員競賽優勢。由於技術配合和心理狀態等各種因素的影響,p ...

8604 運動員最佳配對問題

8604 運動員最佳配對問題 時間限制 1000ms 記憶體限制 1000k 題型 程式設計題語言 無限制 description 羽毛球隊有男女運動員各n人。給定2 個n n矩陣p 和q。p i j 是男運動員 i和女運動員 j配對組成混合雙打的男運動員競賽優勢 q i j 是女運動員 i和男運動...

回溯運動員最佳配對問題

羽毛球隊有男女運動員各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 ...