1. 设计并实现运动员最佳配对组队系统。
算法的分析:
认识运动员最佳配对问题:
一个羽毛球运动队有男女运动员各n人,给定n×n的矩阵P和Q,其中是男运动员i和女运动员j配对组成混合双打的男运动员竞赛优势,是女运动员i和男运动员j配对组成混合双打的女运动员竞赛优势,由于技术配合和心里状态等各种因素影响,不一定等于,男运动员i和女运动员j配合组成混合双打的男女双方竞赛优势为,使各组男女双方竞赛优势的总和达到最大;
算法设计:
设计:设计一个算法,对于给定的男女运动员竞赛优势,计算男女运动员最佳配对法,使各组男女双方竞赛优势的总和达到最大。
数据输入:n,Q,P的值。
数据输出:男女双方竞赛优势的总和的最大值。
#include <stdio.h>
#define NUM 100
int best[NUM],w[NUM],p[NUM][NUM],q[NUM][NUM];
int answer = -1;
void swap(int &a,int &b) { //执行交换
int t = a;
a = b;
b = t;
}
//update方法
void update(int n) {
int sum = 0;
for(int i = 1; i <= n;i++)
sum += p[i][w[i]] * q[w[i]][i];
if(sum > answer) {
answer = sum;
for(int i = 1;i <= n;i++)
best[i] = w[i];
}
}
//backtrack方法
void backtrack(int level,int n) {
if(level > n)
update(n);
else
for(int i = level;i <= n;i++) {
swap(w[level],w[i]);
backtrack(level+1,n);
swap(w[level],w[i]);
}
}
//主函数main
int main() {
int n;
printf("有男女运动员各n人,请输入男女运动员个数n的值:\n");
scanf("%d",&n);
printf("P[i][j]是男运动员i和女运动员j配对男运动员的竞赛优势,请输入P的值:\n");
for(int i = 1;i <= n;i++)
for(int j = 1;j <= n;j++)
scanf("%d",&p[i][j]);
printf("Q[i][j]是男运动员j和女运动员i配对女运动员的竞赛优势,请输入Q的值:\n");
for(int i = 1;i <= n;i++)
for(int j = 1;j <= n;j++)
scanf("%d",&q[i][j]);
for(int i = 1;i <= n;i++)
w[i] = i;
backtrack(1,n);
printf("得到的男女搭配最大优势为:%d\n",answer);
}