数据结构与算法 男女运动员配对最佳问题
问题描述:羽毛球队有男女运动员各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;
}
***************************************************
运行的结果不正确,不晓得哪儿出问题了