题目:

羽毛球队有男女运动员各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]。设计一个算法,计算男女运动员最佳配对方案,使各组男女双方竞赛优势的总和达到最大。

回溯法程序:

#include "stdafx.h"
#include<iostream>
using namespace std;//回溯法
#define NUM 100
int best[NUM]; //最佳组合方式(女运动员的搭配顺序,男运动员按编号顺序站定)
int w[NUM]; //组合方式(中间过程,女运动员的搭配顺序,男运动员按编号顺序站定)
int p[NUM][NUM]; //男运动员i和女运动员j配对组成混合双打的男运动员竞赛优势
int q[NUM][NUM]; //女运动员i和男运动员j配合的女运动员竞赛优势
int answer = -1;
//交换函数
void SwapInt(int *a,int *b)
{int t = *a;*a = *b;*b = t;
}
//更新函数
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];}
}
//求最佳组合函数
void Backtrack(int level,int n)
{if(level>n)Update(n);else{for(int i=level;i<=n;i++){//交换顺序SwapInt(&w[level],&w[i]);//求组合优势和Backtrack(level+1,n);//将次序交换回来,便于下次比较SwapInt(&w[level],&w[i]);}}
}
int main()
{int n,i,j;cout << "enter the number of the player teams: ";cin >> n;//输入P,Q矩阵cout << "input P[i][j]:" << endl;for(i=1;i<=n;i++){w[i] = i;best[i] = w[i];cout << "\t女" << i <<' ';}cout << endl;for(i=1;i<=n;i++){cout << "P[" << i << "][:]: ";for(j=1;j<=n;j++)cin >> p[i][j];}cout << "input Q[i][j]:" << endl;for(i=1;i<=n;i++)cout << "\t男" << i <<' ';cout << endl;for(i=1;i<=n;i++){cout << "Q[" << i << "][:]: ";for(j=1;j<=n;j++)cin >> q[i][j];}//求最优解Backtrack(1,n);//输出最优解(女运动员的搭配顺序,男运动员按编号顺序站定)cout << "男运动员按编号顺序站定,女运动员的搭配顺序为:" << endl;for(i=1;i<=n;i++)cout << best[i] << ' ';system("pause");return 0;
}

运行结果如下:

一般思路程序如下:

#include "stdafx.h"
#include<iostream>
using namespace std;//交换函数
void Swap(int *a,int *b)
{int t = *a;*a = *b;*b = t;
}
int main()
{int n,i,j;int sum;int bestSum=0; //最大优势cout << "enter the number of the player teams: ";cin >> n;//动态创建各数组int *best = new int[n+1]; //最佳组合方式(女运动员的搭配顺序,男运动员按编号顺序站定)int *w = new int[n+1]; //组合方式(中间过程,女运动员的搭配顺序,男运动员按编号顺序站定)int **p = new int*[n+1]; //男运动员i和女运动员j配对组成混合双打的男运动员竞赛优势for(i=0;i<=n;i++)p[i] = new int[n+1];int **q = new int*[n+1]; //女运动员i和男运动员j配合的女运动员竞赛优势for(i=0;i<=n;i++)q[i] = new int[n+1];//输入P,Q矩阵cout << "input P[i][j]:" << endl;for(i=1;i<=n;i++){w[i] = i;best[i] = w[i];cout << "\t女" << i <<' ';}cout << endl;for(i=1;i<=n;i++){cout << "P[" << i << "][:]: ";for(j=0;j<n;j++)cin >> p[i][j];}cout << "input Q[i][j]:" << endl;for(i=1;i<=n;i++)cout << "\t男" << i <<' ';cout << endl;for(i=1;i<=n;i++){cout << "Q[" << i << "][:]: ";for(j=1;j<=n;j++)cin >> q[i][j];}//求最佳组合for(i=1;i<=n;i++)for(j=i+1;j<=n;j++){int k=0;sum = 0;//求当前组合的优势和for(k=1;k<=n;k++)sum = sum + p[i][w[i]]*q[w[i]][i];//如果当前组合的优势和大于之前组合的优势和if(sum > bestSum){//更新优势和bestSum = sum;//更新组合方式for(k=1;k<=n;k++)best[k] = w[k];}//交换组合方式Swap(&w[i],&w[j]);}//输出最优解(女运动员的搭配顺序,男运动员按编号顺序站定)cout << "男运动员按编号顺序站定,女运动员的搭配顺序为:" << endl;for(i=1;i<=n;i++)cout << best[i] << ' ';//释放空间(动态分配的数组空间)delete [n+1]best;delete [n+1]w;for(i=0;i<=n;i++){delete p[i];p[i] = NULL;}delete [n+1]p;p = NULL;for(i=0;i<=n;i++){delete q[i];q[i] = NULL;}delete [n+1]q;q = NULL;system("pause");return 0;
}

运行结果如下:

程序基本算法习题解析 设计一个算法,计算男女运动员最佳配对方案,使各组男女双方竞赛优势的总和达到最大。相关推荐

  1. 回溯法——设计一个算法在1、2、3... 9(顺序不能变)数字之间插入+ 或 - 或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性和全排列

    回溯法 题目描述: 设计一个算法在1.2.3- 9(顺序不能变)数字之间插入+ 或 - 或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性.例如1+2+34-5+67-8+9=100 分 ...

  2. 数据结构:试设计一个算法,改造一个带表头结点的双向链表,所有结点的原有次序保持在各个结点的右链域rLink中,并利用左链域ILink把所有结点按照其值从小到大的顺序连接起来

    题目 试设计一个算法,改造一个带表头结点的双向链表,所有结点的原有次序保持在各个结点的右链域rLink中,并利用左链域ILink把所有结点按照其值从小到大的顺序连接起来 分析 Template < ...

  3. 设计一个算法,借助栈实现单链表链接顺序的逆转

    设计一个算法,借助栈实现单链表链接顺序的逆转: 程序思路:题目要求为借助栈将单链表中的数据逆置输出,栈的特点就是先进后出,只 需要将单链表中的数据依次存储在栈中,然后将栈中的元素依次取出即可.关键代码 ...

  4. 设计一个算法的方法论

    设计一个算法的方法论 引言 多年来本人在研发团队里担任算法设计工程师,设计过的算法包括:电能计量.复杂控制.无线通信和系统架构等.蓦然回首,顿悟算法设计有很多共性,抽取出来大致为6个步骤,结合近段时间 ...

  5. 问题描述 给定一个由n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。 对于给定的由n行数字组成的数字三角形,计算从三角形的顶至底

    问题描述 给定一个由n行数字组成的数字三角形如下图所示.试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大. 对于给定的由n行数字组成的数字三角形,计算从三角形的顶至底的路径 ...

  6. 问题描述: 在一个圆形操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。 规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。 试设计一个算法,计算出将n堆石子

    问题描述: 在一个圆形操场的四周摆放着n 堆石子.现要将石子有次序地合并成一堆. 规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分. 试设计一个算法,计算出将n堆石子 ...

  7. 设单链表中存放n个字符,试设计一个算法,使用栈推断该字符串是否中心对称...

    版权声明:本文为博主原创文章.未经博主同意不得转载. vasttian https://blog.csdn.net/u012860063/article/details/28281631 转载请注明出 ...

  8. 设计一个算法,删除一个单链表L中元素值最大的结点(假设最大值结点是唯一的)

    设计一个算法,删除一个单链表L中元素值最大的结点(假设最大值结点是唯一的). #include <stdio.h> #include<malloc.h> typedef str ...

  9. python计算n阶乘中尾部零的个数_(Java)设计一个算法,计算出n阶乘中尾部零的个数...

    展开全部 long 类型对大数阶乘来e68a8462616964757a686964616f31333365633963说存储范围大小,强行使用会溢出,可以使用 BigDecimal. 代码如下:im ...

最新文章

  1. C# 导出到Excel (使用NPOI 1.2.4)
  2. RIA Service + dataformc操作例子
  3. 检测到目标url存在内部ip地址泄露_Cendertron,动态爬虫与敏感信息泄露检测
  4. 自定义有多个按钮节点的SliderView
  5. html 中rem是什么单位,了解并使用CSS中的rem单位
  6. POJ 2739 Sum of Consecutive Prime Numbers 难度:0
  7. c语言课程设计实训主要目的,C语言课程设计实训指导书.doc
  8. 接口测试基础思维导图
  9. 14周:设计会员登录页面
  10. 基于Python的指数基金量化投资 - 通过指数估值榜进行指数投资
  11. 计算机WORD列宽行高怎么设置,word2010表格列宽和行高怎么设置
  12. 大学多宗持续灵异事件
  13. Linux系列: 777 755区别
  14. Android:短信的接收
  15. 树莓派4b搭建个人云_用树莓派搭建私人简易网盘 2/5 树莓派4B初始设置
  16. 千万珍惜:男人只有一滴泪
  17. html5 比较 特效,8款HTML5特效推荐
  18. delphi的bpl、dcp 、dcu文件意义
  19. IMX6Q的官方uboot移植,并且把1G的DDR3升级成2G的DDR3,修改网络驱动
  20. window.showModalDialog() 过时替代方案

热门文章

  1. mysql 获取唯一值_mysql 获取全局唯一值
  2. 如何为本机配置ip域名映射关系
  3. android手机设置域名ip映射关系
  4. JAVA基础知识点-入门必备
  5. 【人工智能算法图解】之“人工智能初印象”
  6. JAVA 抽象类、值交换、接口、多态
  7. 《3D数学基础:图形与游戏开发》读书笔记
  8. 最新广东省知识产权贯标奖励及补助政策汇总大全,包括广州、深圳等
  9. 学生成绩管理系统(java简略版)
  10. ctd数据 matlab,CTD数据库了解一下,分析你还少了这张图(基因-药物-疾病)