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