数据结构与算法 男女运动员配对最佳问题

yao450860487 2009-12-08 07:11:05
问题描述:羽毛球队有男女运动员各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≦20〉。接下来的2n行,每行n个数。前n行是p,后n行是q。

结果输出:将计算的男女双方竞赛优势的总和的最大值输出到文件output.txt。

输入文件示例 输出文件示例

input.txt output.txt

3 52

10 2 3

2 3 4

3 4 5

2 2 2

3 5 3

4 5 1

*********************************************
// 运动员最佳配对问题.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;
class auther
{
friend int allocation (int ** P,int **Q , int n );
private :
int n ;//男女运动员各n人
int ** P;
int ** Q;
int * w;

int p_sum;//记录当前男女竞赛总优势
int best_sum;//男女运动员配对最优解
protected :
void Backtrack(int k);
void Swap(int &a,int &b);
};

void auther::Backtrack(int k)
{ p_sum=0;
if(k>=n)
{
for(int i=1;i<=n;i++)
{
p_sum+=P[i][w[i]]*Q[w[i]][i];

}
if(p_sum>best_sum)
{
best_sum=p_sum;


}
}
else
{
for(int i=k;i<=n;i++) //产生1:n 的排列
{
Swap(w[k],w[i]);
Backtrack(k+1);
Swap(w[k],w[i]);
}
}
}
void auther::Swap(int &a, int &b)
{
int temp=a;
a=b;
b=temp;
}

int allocation (int ** P,int ** Q,int n)
{
auther X;
X.n=n;
X.P=new int *[n+1];
for(int i=1;i<=n;i++)
X.P[i]=new int [n+1];
X.Q=new int *[n+1];
for(int i=1;i<=n;i++)
X.Q[i]=new int [n+1];
X.best_sum=0;
X.p_sum=0;
X.w=new int [n+1];
for(int i=1;i<=n;i++)
X.w[i]=i;
X.Backtrack(1);
delete X.Q;
delete X.P;
delete X.w;
return X.best_sum;
}
void main()
{
cout<<"请输入男运动或女运动员的人数:"<<endl;
int n;
cin>>n;
int **p=new int*[n+1];
for(int i=1;i<=n;i++)
p[i]=new int [n+1];
int **q=new int*[n+1];
for(int i=1;i<=n;i++)
q[i]=new int [n+1];
cout<<"混双中男运动员的竞赛优势:"<<endl;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
cin >> p[i][j];
}

cout<<"混双中女运动员的竞赛优势:"<<endl;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
cin >> q[i][j];
}

cout<<"男女运动员配对的最佳方案优势的总和是:"<<allocation(p,q,n)<<endl;
}
***************************************************
运行的结果不正确,不晓得哪儿出问题了
...全文
263 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧