用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c++代码库

运动员最佳匹配问题

2012-09-20 作者: 神马举报

[c++]代码库

 

问题描述:

羽毛球队有男女运动员各n人。给定2n×n矩阵PQP[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;
}



网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...