问题描述:
羽毛球队有男女运动员各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
Sample Output
52
#include<iostream> |
using namespace std; |
int a[22]; |
int p[22][22]; |
int q[22][22]; |
int n; |
int sum=0; |
void swap ( int &x, int &y ) |
{ |
int temp=x; |
x=y; |
y=temp; |
} |
void Backtrack ( int t ) |
{ |
if ( t>n ) |
{ |
int s=0; |
for ( int j=0; j<n; j++ ) |
{ |
s+=p[j][a[j+1]-1]*q[a[j+1]-1][j]; |
} |
if ( s>=sum ) sum=s; |
} |
else |
{ |
for ( int i=t; i<=n; i++ ) |
{ |
swap ( a[i],a[t] ); |
Backtrack ( t+1 ); |
swap ( a[i],a[t] ); |
} |
} |
} |
int main() |
{ |
int i,j; |
while ( cin>>n ) |
{ |
for ( i=0; i<=n; i++ ) a[i]=i; |
for ( i=0; i<n; i++ ) |
{ |
for ( j=0; j<n; j++ ) |
{ |
cin>>p[i][j]; |
} |
} |
for ( i=0; i<n; i++ ) |
{ |
for ( j=0; j<n; j++ ) |
{ |
cin>>q[i][j]; |
} |
} |
Backtrack ( 1 ); |
cout<<sum<<endl; |
} |
return 0; |
} |