今天在做POJ 1753时,需要枚举一个数组中所有组合。之前也遇到过类似的问题,如求从n个数组任意选取一个元素的所有组合都是想起来比较简单,但是设计成算法却颇费周折。
如数组为{1, 2, 3, 4, 5, 6},那么从它中取出3个元素的组合有哪些,取出4个元素的组合呢?
比如取3个元素的组合,我们的思维是:
取1、2,然后再分别取3,4,5,6;
取1、3,然后再分别取4,5,6;
......
取2、3,然后再分别取4,5,5;
......
这样按顺序来,就可以保证完全没有重复。

这种顺序思维给我们的启示便是这个问题可以用递归来实现,但是仅从上述描述来看,却无法下手。
我们可以稍作改变:
1.先从数组中A取出一个元素,然后再从余下的元素B中取出一个元素,然后又在余下的元素C中取出一个元素
2.按照数组索引从小到大依次取,避免重复

依照上面的递归原则,我们可以设计如下的算法,按照索引从小到大遍历:

//arr为原始数组
//start为遍历起始位置
//result保存结果,为一维数组
//count为result数组的索引值,起辅助作用
//NUM为要选取的元素个数
//arr_len为原始数组的长度,为定值
void combine_increase(int* arr, int start, int* result, int count, const int NUM, const int arr_len)
{int i = 0;for (i = start; i < arr_len + 1 - count; i++){result[count - 1] = i;if (count - 1 == 0){int j;for (j = NUM - 1; j >= 0; j--)printf("%d\t",arr[result[j]]);printf("\n");}elsecombine_increase(arr, i + 1, result, count - 1, NUM, arr_len);}
}

从数组中取出n个元素的所有组合(递归实现)相关推荐

  1. js随机从数组中取出几个元素

    这篇文章为转载,我的需求是从题库中,随机抽几道题,作为新试卷.代码如下: var items = ['1','2','4','5','6','7','8','9','10']; 1.从数组items中 ...

  2. 从数组中取出m个数相加的结果(组合)

    给定一个数组,输入m,求出m个数相加的和. 如num[6]={1,2,4,8,16,32};, m=1时,为 1,2,4,8,16,32 m=2时,为3,5,6,9,10,12,17,18,20,24 ...

  3. 从n个不同元素中取出m个元素排列组合

    01. 问题 问题01. 算法: 从n个不同元素中取出m个元素的排列数是多少? 这些排列分别是什么? (其中: n > 0; 0 < m ≤ n;) 问题02. 算法: 从n个不同元素中取 ...

  4. python矩阵中找满足条件的元素_从numpy数组中取出满足条件的元素示例

    例如问题:从 arr 数组中提取所有奇数元素. input:arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) output: #> array([1, ...

  5. C语言编程>第十八周 ⑧ 给定程序中,函数fun的功能是:将形参指针所指结构体数组中的三个元素按num成员进行升序排列。

    例题:给定程序中,函数fun的功能是:将形参指针所指结构体数组中的三个元素按num成员进行升序排列. 注意:请勿改动主函数main与其他函数中的任何内容,仅在横线上填写所需的若干表达式或语句. 代码如 ...

  6. 数组中第K大元素(java多种方式实现)

    题目描述: Leetcode215题:在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5 ...

  7. 从键盘输入10个互不相同的整数,找出其中最小的元素将其与数组中的第一个元素进行交换。

    题目: /* 从键盘输入10个互不相同的整数,找出其中最小的元素将其与数组中的第一个元素进行交换. */ 代码: c++做的. #include<iostream> using names ...

  8. 分治法求数组中的最大最小元素

    #include<iostream> using namespace std; //分而治之法求数组中的最大最小元素 void maxmin(int i,int j,int A[],int ...

  9. 指针增量和数组的关系,指针偏移的补充,(重要面试),gdp调试,将数组中的n个元素逆序存放

    1.指针增量和数组的关系 //加1  代表了地址偏移了一个类型的字节数(整形数偏移四个字节,char形数偏移了一个字节) 再来下标法: 2.指针偏移的补充 也可以换一种写法(第12行) 但是呢同样的代 ...

最新文章

  1. 2017 Material design 第二章第六节《富有创造性的定制方案》
  2. Spring框架中IoC(控制反转)的原理
  3. tensorflow之XORerr1例题
  4. 以WBS模板和PBS自动生成WBS计划任务
  5. 【python初级】 ubuntu18.04下卸载Anaconda3
  6. 普及一下行业尖端知识——腾讯自研分布式数据库TBase
  7. ArcGIS的mxd文档存储为相对路径
  8. 微信 获取signature签名
  9. 华为消费者云的ServiceComb 微服务之旅
  10. Set集合及源码分析
  11. 深度详解什么是SaaS(软件即服务)
  12. DateTimePicker 日期时间选择器设置默认时间
  13. Android加载超长图(微博长图)
  14. ANT DESIGN VUE upload 上传excel (使用upliad组件,上传excel到页面表格)
  15. blackberry环境搭建
  16. 数字图像处理复习笔记
  17. 木马是如何编写的 FROM HACKBASE
  18. 安科瑞变电所运维云平台解决方案
  19. spring-boot-starter自动装配流程总结
  20. taichi安装与使用

热门文章

  1. 【Android NDK 开发】Kotlin 语言中使用 NDK ( 创建支持 Kotlin 的 NDK 项目 | Kotlin 语言中使用 NDK 要点 | 代码示例 )
  2. 【组合数学】递推方程 ( 非齐次部分是 指数函数 且 底是特征根 | 求特解示例 )
  3. 【Netty】Netty 简介 ( 原生 NIO 弊端 | Netty 框架 | Netty 版本 | 线程模型 | 线程 阻塞 IO 模型 | Reactor 模式引入 )
  4. 【Android 应用开发】Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简介
  5. template模板中插入自定义参数
  6. 使用Filter跟踪Asp.net MVC页面加载(转)
  7. http://tpl.amazeui.org/
  8. 历史命令history
  9. [翻译]No.9352 SharePoint Pages(1)之SharePoint页面体系架构
  10. win10下mysql 8.0.18 安装配置方法图文教程