m选n组合的两种算法(C语言实现)
原问题:
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语言实现)相关推荐
- 剪拼子字符串——常规、另类两种算法解CSDN竞赛第八期第一小题
[点击此处跳转笔记正文] Python 官网:https://www.python.org/ Free:大咖免费"圣经"教程< python 完全自学教程>,不仅仅是基 ...
- 人机版五子棋两种算法概述
人机版五子棋是很有挑战性的.至今好像没有保证可以取胜的算法,但已经有不少写的很专业的五子棋程序了.我在编写五子棋的过程中参考了不少资料,发现人机五子棋大致有两种策略.在这儿总结一下,与大家共享.先说两 ...
- 欧拉回路/路径浅谈(七桥问题,两种算法)
文章目录 前言 引子 欧拉回路/路径 定义 欧拉路径 欧拉回路 无向图(连通) 欧拉回路-无向 欧拉路径-无向 有向图(连通) 欧拉回路-有向 欧拉路径-有向 注意事项 算法 Fluery算法 Hie ...
- NILM(非侵入式电力负荷监测)学习笔记 —— 使用NILMTK Toolkit,REDD数据集,CO和FHMM两种算法
(本文最后,提供整个工程下载) 准备工作 本篇的内容都是基于我前两篇的环境,和数据集进行的. NILM(非侵入式电力负荷监测)学习笔记 -- 准备工作(一)配置环境NILMTK Toolkit NIL ...
- “斐波那契数列”的两种算法
"斐波那契数列"的两种算法 斐波那契数列有个规律:从第三个数开始,每个数是前两个数之和,比如: 1 1 2 3 5 8 13 21 34 55...... 现在通过两种方式(递归与 ...
- ML之SVM:利用SVM算法对手写数字图片识别数据集(PCA降维处理)进行预测并评估模型(两种算法)性能
ML之SVM:利用SVM算法对手写数字图片识别数据集(PCA降维处理)进行预测并评估模型(两种算法)性能 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 estimator = PC ...
- ML之RFDT:利用RF(RFR)、DT(DTR)两种算法实现对boston(波士顿房价)数据集进行训练并预测
ML之RF&DT:利用RF(RFR).DT(DTR)两种算法实现对boston(波士顿房价)数据集进行训练并预测 目录 输出结果 实现代码 输出结果 1.两种算法的预测结果 2.回归树的可视化 ...
- 在.Net framework下遍历XML文挡树的两种算法
在阅读ASP.NET_XML深入编程技术 (PDF格式)一书的时候,发现遍历树的两种算法:深度优先和广度优先遍历文挡树,前一种需要使用递归,后者则不需要,本人大学时期数据结构学的不好,每每涉及到树,总 ...
- Fletcher-Reevers Conjugate Descent和Steepest Descent两种算法中伪代码的区别
本文主要用来比较两个算法到底差别在哪里 step Fletcher-Reevers Conjugate Descent Steepest Descent 1st1st1st 选择初始点x(1)选择初始 ...
- java进程调度怎么画图,[Java教程]进程调度的两种算法JAVA实现
[Java教程]进程调度的两种算法JAVA实现 0 2015-10-21 12:00:08 (SJF分为preemptive shortest job first(抢占式)和non-preemptiv ...
最新文章
- Docker入门六部曲——Stack
- 5 款非常好用的开源 Docker 工具,get一波~
- 皱眉细节完美复刻,阿尔伯塔大学团队标星2.5K的项目生成超逼真的肖像画
- redis做简单mq的高可用
- Spring-Boot项目部署到单独tomcat运行
- 为您的机器配置开发环境
- 一个设计项调另一个设计项(支持多选传值)
- centOS 6 rpm安装MySQL小记
- qdu-凑数题(01背包)
- [php]php设计模式 Bridge (桥接模式)
- c语言字符型数据怎么输入输出,C语言基础之数据类型与输入/输出
- python学习Day4 流程控制(if分支,while循环,for循环)
- ARFoundation系列讲解 - 62 人脸跟踪三
- python读取Himawari-8葵花8标准数据(HSD)
- 对数幅度谱图像matlab,fft2绘制图像的对数幅度谱,比较图像旋转平移和缩放后的频谱.doc...
- dll hijack 学习
- wait和notify方法
- 微信如何恢复删掉的好友,巧妙添加好友的方法汇总
- 修改 SSH 端口号
- Webrtc 多人视频会议系统 服务器 Licode 介绍
热门文章
- Extjs Design 可视化开发工具
- 10分钟看懂财务报表分析,只需掌握一个公式!
- Zstack协议栈中CC2530协调器掉电重启后重新加入之前网络的方法
- js中函数传参的问题
- 安装打印机时出现无法安装,打印处理器不存在
- 解析人工智能与高等教育中的大数据
- lcd像素点密度_常见液晶显示分辨率对应像素密度
- 我国使用计算机增长率表格,excel表格如何计算数据的增长率-怎么用Excel计算年均复合增长率?...
- tassel软件使用linux,科学网—TASSEL 关联分析软件 起步教程 - 邓飞的博文
- 夜神模拟器和虚拟机(docker) 在windows上设置不兼容