问题描述:
羽毛球队有男女运动员各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; }