原问题:

 Given two integers n and k, return all possible combinations of k numbers out of 1 ... n.

1. 递归算法

即首先选择n,然后递归地从剩下的1...n-1选择k-1个数,然后选择n-1,然后递归地从剩下的1...n-2选择k-1个数,直到选到k。

//d存储选择的数,NUM指示选择多少个数,即初始k的大小
void Recursive_SelectK(int n,int k,int d[],const int NUM)
{int i = n;if(k > n) return;while(i>=k){d[NUM-k] = i;if(k>1) Recursive_SelectK(i-1,k-1,d,NUM);else{int j = 0;while(j<NUM){printf("%d ",d[j]);j++;}printf("\n");}i--;}
}

2. 01转换算法

首先初始化一个n大小的数组,0代表未选择,1代表选择,每次都有k个1,n-k个0,当把所有的01组合列出,即是n选k的所有组合。得到所有01组合的算法描述如下:

  • 首先初始化,将数组前k个元素置1,表示第一个组合为前k个数。
  • 然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为“01”组合;
  • 同时将其左边的所有“1”全部移动到数组的最左端。
  • 当第一个“1”移动到数组的n-k的位置,即n个“1”全部移动到最右端时,就得到了最后一个组合。
void SelectK_01(int n,int k)
{//true is selectedbool *nselect = (bool *)malloc(n*sizeof(bool));int i = 0;//初始化第一个组合,即选择前k个数 while(i<n){if(i<k)nselect[i] = true;elsenselect[i] = false;i++;}i = 0;while(i<n){if(nselect[i]) printf(" %d ",i+1);i++;}printf("\n");i=0;while(i<n-1){//找到第一个10组合,并交换10的位置 if(nselect[i] && !nselect[i+1]){int temp = nselect[i];int x=0,y=0;nselect[i] = nselect[i+1];nselect[i+1] = temp;//将该组合左边所有的1移至数组最左边 while(y<i){if(nselect[y]){temp = nselect[y];nselect[y] = nselect[x];nselect[x] = temp;x++;}y++;}i = 0;while(i<n){if(nselect[i]) printf(" %d ",i+1);i++;}printf("\n");i = (x==0?0:x-1);}else i++; }free(nselect);
}

m选n组合的两种算法(C语言实现)相关推荐

  1. 剪拼子字符串——常规、另类两种算法解CSDN竞赛第八期第一小题

    [点击此处跳转笔记正文] Python 官网:https://www.python.org/ Free:大咖免费"圣经"教程< python 完全自学教程>,不仅仅是基 ...

  2. 人机版五子棋两种算法概述

    人机版五子棋是很有挑战性的.至今好像没有保证可以取胜的算法,但已经有不少写的很专业的五子棋程序了.我在编写五子棋的过程中参考了不少资料,发现人机五子棋大致有两种策略.在这儿总结一下,与大家共享.先说两 ...

  3. 欧拉回路/路径浅谈(七桥问题,两种算法)

    文章目录 前言 引子 欧拉回路/路径 定义 欧拉路径 欧拉回路 无向图(连通) 欧拉回路-无向 欧拉路径-无向 有向图(连通) 欧拉回路-有向 欧拉路径-有向 注意事项 算法 Fluery算法 Hie ...

  4. NILM(非侵入式电力负荷监测)学习笔记 —— 使用NILMTK Toolkit,REDD数据集,CO和FHMM两种算法

    (本文最后,提供整个工程下载) 准备工作 本篇的内容都是基于我前两篇的环境,和数据集进行的. NILM(非侵入式电力负荷监测)学习笔记 -- 准备工作(一)配置环境NILMTK Toolkit NIL ...

  5. “斐波那契数列”的两种算法

    "斐波那契数列"的两种算法 斐波那契数列有个规律:从第三个数开始,每个数是前两个数之和,比如: 1 1 2 3 5 8 13 21 34 55...... 现在通过两种方式(递归与 ...

  6. ML之SVM:利用SVM算法对手写数字图片识别数据集(PCA降维处理)进行预测并评估模型(两种算法)性能

    ML之SVM:利用SVM算法对手写数字图片识别数据集(PCA降维处理)进行预测并评估模型(两种算法)性能 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 estimator = PC ...

  7. ML之RFDT:利用RF(RFR)、DT(DTR)两种算法实现对boston(波士顿房价)数据集进行训练并预测

    ML之RF&DT:利用RF(RFR).DT(DTR)两种算法实现对boston(波士顿房价)数据集进行训练并预测 目录 输出结果 实现代码 输出结果 1.两种算法的预测结果 2.回归树的可视化 ...

  8. 在.Net framework下遍历XML文挡树的两种算法

    在阅读ASP.NET_XML深入编程技术 (PDF格式)一书的时候,发现遍历树的两种算法:深度优先和广度优先遍历文挡树,前一种需要使用递归,后者则不需要,本人大学时期数据结构学的不好,每每涉及到树,总 ...

  9. Fletcher-Reevers Conjugate Descent和Steepest Descent两种算法中伪代码的区别

    本文主要用来比较两个算法到底差别在哪里 step Fletcher-Reevers Conjugate Descent Steepest Descent 1st1st1st 选择初始点x(1)选择初始 ...

  10. java进程调度怎么画图,[Java教程]进程调度的两种算法JAVA实现

    [Java教程]进程调度的两种算法JAVA实现 0 2015-10-21 12:00:08 (SJF分为preemptive shortest job first(抢占式)和non-preemptiv ...

最新文章

  1. Docker入门六部曲——Stack
  2. 5 款非常好用的开源 Docker 工具,get一波~
  3. 皱眉细节完美复刻,阿尔伯塔大学团队标星2.5K的项目生成超逼真的肖像画
  4. redis做简单mq的高可用
  5. Spring-Boot项目部署到单独tomcat运行
  6. 为您的机器配置开发环境
  7. 一个设计项调另一个设计项(支持多选传值)
  8. centOS 6 rpm安装MySQL小记
  9. qdu-凑数题(01背包)
  10. [php]php设计模式 Bridge (桥接模式)
  11. c语言字符型数据怎么输入输出,C语言基础之数据类型与输入/输出
  12. python学习Day4 流程控制(if分支,while循环,for循环)
  13. ARFoundation系列讲解 - 62 人脸跟踪三
  14. python读取Himawari-8葵花8标准数据(HSD)
  15. 对数幅度谱图像matlab,fft2绘制图像的对数幅度谱,比较图像旋转平移和缩放后的频谱.doc...
  16. dll hijack 学习
  17. wait和notify方法
  18. 微信如何恢复删掉的好友,巧妙添加好友的方法汇总
  19. 修改 SSH 端口号
  20. Webrtc 多人视频会议系统 服务器 Licode 介绍

热门文章

  1. Extjs Design 可视化开发工具
  2. 10分钟看懂财务报表分析,只需掌握一个公式!
  3. Zstack协议栈中CC2530协调器掉电重启后重新加入之前网络的方法
  4. js中函数传参的问题
  5. 安装打印机时出现无法安装,打印处理器不存在
  6. 解析人工智能与高等教育中的大数据
  7. lcd像素点密度_常见液晶显示分辨率对应像素密度
  8. 我国使用计算机增长率表格,excel表格如何计算数据的增长率-怎么用Excel计算年均复合增长率?...
  9. tassel软件使用linux,科学网—TASSEL 关联分析软件 起步教程 - 邓飞的博文
  10. 夜神模拟器和虚拟机(docker) 在windows上设置不兼容