分治算法

  • 将一个计算复杂的问题分为若干个子问题来进行求解,然后综合各个小问题得到复杂问题的最终答案

    1. 分解:
      将原问题分解为若干规模较小的,相互独立,与原问题相同的子问题

    2. 解决:
      如果小问题容易解决就解决若干的子问题,不然就是继续解决第一个步骤,直到子问题可以解决

    3. 合并:
      将解决好的子问题的解合并为原问题的解

      有些问题是不需要合并子问题的解的,此时就不需要第三步了。

例题

  • 乒乓球比赛日程问题:
    问题:设有n名选手参赛,初赛进行n-1天,每位选手每一天必须比赛一次不轮空。

    • 分析:

      • 对于n位选手来说,这是一个复杂的计算,可以将它分解为较为小的子问题,比如说只有两个人参赛;
      • 解决两个人参赛的赛程,发现还是不足以分配,然后再分析4个人、8个人……等,直到问题得以解决
  • 解决:

#include<stdio.h>
#include<stdlib.h>
void schedule(int n,int m);
int check(int m);
int player[65][65] = {0};
int main()
{int m; printf("输入参赛人数:");scanf("%d",&m);if(!check(m)){printf("输入的数必须是2的整数幂");return 0;}schedule(1,m);for(int i = 1;i <= m;i++){for(int j = 1;j <= m;j++){printf("%3d",player[i][j]);}printf("\n");}}
void schedule(int n,int m)
{if(m == 2){  //达到最小可以解决的时候player[n][1] = n;player[n][2] = n+1;player[n+1][1] = n+1;player[n+1][2] = n;}else{schedule(n,m/2);//没到最小可以解决的时候就继续分解schedule(n + m/2,m/2);//这时候已经解决完了最小可解决问题,回来解决另一半的最小程度m//开始解决剩下的部分for(int i = n+m/2;i <= n+m; i++){for(int j = m/2 + 1;j <= m;j++){player[i][j] = player[i - m/2][j - m/2];}}for (int i = n; i < n + m/2; i++){for(int j = m/2 + 1;j <= m; j++){player[i][j] = player[i + m/2][j - m/2];}}}
}
int check(int m)
{int i = 2;int j = 2;for(int i;i < 8;i++){j *= 2;if(j == m)   break;}if(i >= 8){return 0;}return 1;
}

分治算法——乒乓球比赛日程问题相关推荐

  1. 分治算法兵乓球比赛日程(java)

    分治算法之兵乓球比赛日程 分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同.求出子问题的解,就可得到原问题的解.也就是字面上的解释是" ...

  2. java 比赛赛程_分治算法兵乓球比赛日程(java)

    分治算法之兵乓球比赛日程 分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同.求出子问题的解,就可得到原问题的解.也就是字面上的解释是" ...

  3. 分治算法之循环赛程日志表

    什么是分治算法? 就是当求解的数据过多,计算的过程过于复杂的情况即可使用分治算法 分治算法的一般步骤: 1.分解:将复杂问题划分为若干同类小问题 2.求解:当子问题足够小时,用简单的方法解决 3.合并 ...

  4. 漫画:5分钟弄懂分治算法!它和递归算法的关系!

    分治顾名思义"分而治之",英文的意思翻译为"分割并征服". 分治思想,简而言之就是将原问题分解成与"原问题相同但是规模更小"的子问题,并可以 ...

  5. 三十三、分治算法---汉诺塔问题

    一.分治算法的介绍 分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或 相似的子问题,再把子问题分成更小的子问题--直到最后子问题可以 ...

  6. 快速排序 c++_算法浅谈——分治算法与归并、快速排序(附代码和动图演示)

    本文始发于个人公众号:TechFlow 在之前的文章当中,我们通过海盗分金币问题详细讲解了递归方法. 我们可以认为在递归的过程当中,我们通过函数自己调用自己,将大问题转化成了小问题,因此简化了编码以及 ...

  7. 从分治算法到 MapReduce

    为什么80%的码农都做不了架构师?>>>    从分治算法说起 要说 MapReduce 就不得不说分治算法,而分治算法其实说白了,就是四个字 分而治之 .其实就是将一个复杂的问题分 ...

  8. 计算机基础算法棋盘覆盖,分治算法求解棋盘覆盖问题互动教学过程.doc

    分治算法求解棋盘覆盖问题互动教学过程 分治算法求解棋盘覆盖问题互动教学过程 摘要:针对算法设计与分析课程难度较大.对学生编程能力要求较高的现状,通过对棋盘覆盖问题的分治算法求解过程进行互动教学设计,引 ...

  9. 编程珠玑第八章——分治算法求解数组中的最大的连续和

    关键在于把数组分为两个部分a,b.最大的连续和要么在a要么在b,另外还有可能就是跨越a,b的边界,将跨越边界的最大向量称为mc. 一个注意的地方就是mc正在a中的部分包含右边边界的最大子向量,而mc在 ...

最新文章

  1. Python速度提升
  2. python中的连续比较是什么_在python中提取连续行之间的差异
  3. 怎样能做好百度竞价推广?不妨参考下这篇竞价推广的日常工作流程
  4. spring集成kafka
  5. Python 怎么样在函数内部对全局变量进行修改
  6. 双十一大促技术只做两件事情?来看看阿里巴巴的技术之道
  7. CRM和C4C里的组织架构 - Organizational Structure
  8. PHP大数据处理【转】
  9. lamda表达式修改数据_图解sql面试题:如何按条件修改数据?
  10. 训练日志 2019.4.17
  11. 理论基础 —— 二叉树
  12. Htmlt_Div+Css简介
  13. Printer Processor 导致的一个问题
  14. mybaties :required string parameter ‘XXX‘is not present
  15. uni-app开发开发h5,小程序,app,注意事项
  16. WM6电话簿转到Android系统
  17. 计算机桌面组成部分教案,三年级第6课 《认识桌面》优秀教案
  18. 在微信小游戏中使用tensorflow的face-landmarks-detection
  19. 面试了一个 37 岁程序员,让我有所触动,35岁以上的程序员该何去何从?
  20. PCB设计中的的3W规则和20H原则

热门文章

  1. 车辆提示请防止车辆滑动 即车辆驻车异常
  2. vue 富文本存储_VUE 富文本(vue2-editor)
  3. 几何基础 点投影到直线
  4. 读邹欣关于大学生关系有感
  5. 写一段python判断是否是闰年的代码
  6. 软件工程毕业设计课题(38)基于JAVA毕业设计JAVA座位预约餐厅网站系统毕设作品项目
  7. STM32 使用Keil下载仿真时,报错 JLink Info: STM32Fxxxx: Cannot attach to CPU. Trying connect under reset.
  8. 图像增强(空域滤波)——图像平滑
  9. 【JAVA百炼成仙】元婴篇——藏在游戏中的数组
  10. java基础考试_java基础笔试题