题目:

n个数1,2,...,n,从这n个数中任意选m个数,输出所有不同组合,共有C(n,m)种不同组合。如n=4,m=2,会产生如下输出:
1 2
1 3
2 3
1 4
2 4
3 4如n=5,m=3,会产生如下输出:
1 2 3
1 2 4
1 3 4
2 3 4
1 2 5
1 3 5
2 3 5
1 4 5
2 4 5
3 4 5

题解:

1. 题解一:(正向打印)

1. 选择第i(m <=i<=n)个元素作为每个组合的最后元素,在第1————i个元素中往前(前i - 1个元素中)选取m-1个元素。
2. 若m等于1(对应b[0]),则表示选完,输出该组合(数组b中存储的是组合的元素在a中的下标)
3. 若m>1,则重复1、2步骤

例如:

从后往前选取,选定位置i后,再在前i-1个里面选取m-1个。如 1 2 3 4 5 中选取 3 个1、如果不包含5、也不包含4,直接选取3,那么再在前2个里面选取2个,刚好只有两个。2、如果只不包含5,直接选定4,那么再在前3个里面选取2个,而前3个里面选取2个又是一个子问题,递归即可。3、选取5后,再在前4个里面选取2个,而前4个里面选取2个又是一个子问题,递归即可。纵向看,1、2、3刚好是一个for循环,初值为m(m == 3),终值为n(n == 5)横向看,该问题为一个前i-1个中选m-1的递归。

2. 题解二:(反向打印)

组合问题就是从n中选m个数,也是采用递归的方式

a. 首先从n个数中选取编号最大的数,然后在剩下的n-1个数里面选取m-1个数,直到从n-(m-1)个数中选取1个数为止。

b. 从n个数中选取编号次小的一个数,继续执行1步,直到当前可选编号最大的数为m。

代码:

1. 代码一:(正向打印)

import java.util.*;public class Main {public static void C(int n, int m, int a[], int b[]){for(int i = m; i <= n; i++){b[m - 1] = i - 1;if(m > 1){C(i - 1, m - 1, a, b);}else{for(int j = 0; j < b.length; j++){System.out.printf("%d ", a[b[j]]);}System.out.println();}}}public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt(); // 4int m = sc.nextInt(); // 2int a[] = new int[n];for(int i = 0; i < n; i++){a[i] = i + 1; // a[0, 1, 2, 3] = { 1, 2, 3, 4};}int b[] = new int[m]; // 数组b中存储的是组合的元素在a中的下标C(n, m, a, b);sc.close();}}// // 输入:
// 4 2// // 输出:
// 12
// 13
// 23
// 14
// 24
// 34

2. 代码二:(反向打印)

/// 求从数组a[1..n]中任选m个元素的所有组合。
/// a[1..n]表示候选集,n为候选集大小,n>=m>0。
/// b[1..M]用来存储当前组合中的元素(这里存储的是元素下标),
/// 常量M表示满足条件的一个组合中元素的个数,M=m,这两个参数仅用来输出结果。
void combine( int a[], int n, int m,  int b[], const int M )
{for(int i=n; i>=m; i--)   // 注意这里的循环范围{b[m-1] = i - 1;if (m > 1)combine(a,i-1,m-1,b,M);else                     // m == 1, 输出一个组合{for(int j=M-1; j>=0; j--)cout << a[b[j]] << " ";cout << endl;}}
}

参考:

  1. (剑指offer)从n个数中选取m个数的所有组合
  2. 打印从n个数种选取m个数的组合数
  3. 排列组合算法
  4. C语言实现的排列组合问题的通用算法、解决方法
  5. 输出从n个数中选m个数的所有组合
  6. 递归实现 从n个数中选取m个数的所有组合

从n个数中选取m个数的所有组合相关推荐

  1. 从多个数中取出之和等于定值的组合

    这个问题也比较常见,网上方法也很多. 这里也是用数组的方法来完成.用到了集合.子集的思想.注释中详细说明了. 从m个数中选出n个数来 ( 0 < n <= m), 要求n个数之间不能有重复 ...

  2. Java黑皮书课后题第7章:*7.28(数学:组合)编写一个程序,提示用户输入10个整数,然后显示从这10个数中选出两个数的所有组合

    7.28(数学:组合) 题目 题目描述 破题 代码 运行示例 题目 题目描述 *7.28(数学:组合)编写一个程序,提示用户输入10个整数,然后显示从这10个数中选出两个数的所有组合 破题 声明一个长 ...

  3. [算法] 求排列组合: 从n个数中任选m个数组成一个新数

    #include <iostream> #include <vector>using namespace std;// 求排列组合算法: C(n, m): 从n个数中任选m个数 ...

  4. Nono从一开始数数,他每数一个数时会计算这个数中1的个数(如211中有两个1)并对1的个数进行累和,当1的个数之和不小于x时,Nono就要起床了。特别需要注意的是,当Nono数数达到10000时,N

    [题目描述] 众所周知,Nono是一只喜欢睡懒觉的熊猫."我曾经也是早睡早起,直到我膝盖中了一箭",Nono如是解释道.现在Nono又遇到了一个难题:他睡醒了-但是显然,Nono并 ...

  5. N个数中选择M个数的组合(1MN)

    要求:利用递归算法求出N个数,并从1-N这N个数中,任意取M个数(1<M<N)的所有组合情况,用递归实现! #include<stdio.h> const int MAX = ...

  6. c语言while输入n求n个奇数,任意输入n个整数,输出这n个数中的奇数个数和偶数个数.用while语句...

    C语言 输入n并输入n个数,输出这n个数中的所有奇数的乘积 #includevoidmain(){inti,n,arr[100],mul=1;printf("请输入n值:");sc ...

  7. java 10的倍数_java实现 在5个数中找到3个数的和是10的倍数

    //聚光 //在数据中找出3个数,使得三个数的和为10的倍数:若是10的倍数则观察另外两个数的和是否能被10整除若能返回INTEGER的最大值,否则返回余数 : import java.util.*; ...

  8. 从给定的N个正数中选取若干个数之和最接近M

    http://www.ahathinking.com/archives/110.html 这道题跟捞鱼问题一样,都是刚进实验室新生培训那会儿做过的题目,不过这个是一师姐当时找工作的面试题. 如题,并输 ...

  9. 从n个数中选出m个数的组合

    找出从自然数1,2,3,-,n中任取m个数的所有组合.例如:n=5,m=3时,所有组合为543,542,541,532,531,521,432,431,421,321. #include<ios ...

最新文章

  1. Ardino基础教程 25_8X8LED点阵
  2. FreeCAD v0.19源码编译与VS2017+Qt5环境搭建
  3. 数据安全架构设计与实战~如何加密结构化数据
  4. heap python_数据结构-堆(Heap) Python实现
  5. C#图解教程 第十三章 委托
  6. 由浅至深 谈谈.NET混淆原理(三)-- 流程混淆
  7. php mysql销售_计算用于销售应用程序的php / mysql中的损益(每日,每月和每年)...
  8. python语法基础整理_Python基础语法笔记整理——只记录部分不熟少用的
  9. 5000字彻底道尽「区块链分叉」真相!
  10. GNS3+GNS3 VM
  11. HTML5页面播放音乐
  12. 我的世界逆时空服务器怎么注册密码,我的世界1.7.10服务器逆时空
  13. 【转帖】龙芯3A3000处理器深度评测:和Intel、AMD差距巨大
  14. 如何使用PPT制作机器学习模型图
  15. 【cocos源码学习】cocos2d-x-4.0 Android Demo工程结构的简析
  16. 华为畅享9额android9,华为畅享9
  17. 2017蓝桥杯B组国赛 瓷砖样式
  18. 11月YouTube全球视频点赞Top10 :碧梨、比伯、萌德、A妹神仙打架
  19. 非组蛋白带什么电荷_非组蛋白是构成真核生物染色体的基本结构蛋白, 富含带正电荷的精氨酸( Arg ) 和赖氨酸( Lys ) 等碱 性氨基酸。_学小易找答案...
  20. 如何利用MAXScript代码进行DNA双螺旋结构的创建

热门文章

  1. [N32G45x]轻松几步将embOS移植到国民N32G45X上
  2. APP内嵌网页使用微信或支付宝的H5支付
  3. unity 中使角色按键更灵敏。
  4. 云之讯——简单的短信验证 PHP版
  5. 开放封闭原则(SCP:Open-Closed Principle)
  6. 文本处理之句子切分-日语和英语
  7. JAVA获得任务栏高度
  8. 笔记本电脑硬盘不见了_笔记本电脑开机找不到硬盘完美解决方法
  9. 数据库课设项目(下) 医护人员与患者
  10. 复杂句变简单句 java_英语简单句变复杂句的精华!