/*=====================================
数的组合问题。从1,2,…,n中取出m个数,将所有组合按照字典顺序列出。
如n=3,m=2时,输出:
1 2
1 3
2 3 这里只考虑从互不相同的n个数当中选择m个的情况。
我的思路:
这里采用的思路和上回解决递归生成全排列的思路差不多。
从a数组的n个数当中选m个到ans数组。
每一次选择一个数到ans[i]时都在a数组中扫描并依次选择所有的可能。
但是这里扫描的范围是从ans[i-1]在a中的下标k的下一个开始,一直扫描到n-(m-i-1)的前一个位置为止。
这个范围是ans[i]的可能选择的范围。(后面还要选一部分才凑够m个数,故不能扫描到a数组的末尾。)
======================================*/
 #include<stdio.h>
int count=;
void fun(int a[],int n,int m,int i,int k,int ans[]);
//原始数组a[],从a数组的n个数当中选m个数,结果放在ans数组。
//i表示当前要选取第i个数。i从0开始。k表示上一次选取的数在a数组当中的下标。
//最开始时k==-1,表示还没选数据。
int main()
{
int n,m,a[],ans[],i;
freopen("5.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=;i<n;i++)
{
//scanf("%d",&a[i]);
a[i]=i+;
}
fun(a,n,m,,-,ans);
printf("%d\n",count);
return ;
}
void fun(int a[],int n,int m,int i,int k,int ans[])
//原始数组a[],从a数组的n个数当中选m个数,结果放在ans数组。
//i表示当前要选取第i个数。i从0开始计数。k表示上一次选取的数在a数组当中的下标。
//最开始时k==-1,表示还没选数据。
{
int j;
if(i==m)
{
for(j=;j<m;j++) printf("%d ",ans[j]);
printf("\n");
count++;
return ;
}
else
{
for(j=k+;j<n-(m-i-);j++)//从第k+1个开始,尝试选择第i个数。(注意:i从0开始计算)
{
ans[i]=a[j];
fun(a,n,m,i+,j,ans);
}
}
}

下面是网上的做法,思路挺好的。

来源:http://blog.csdn.net/challenge_c_plusplus/article/details/6641950

原文如下:

此法借鉴了2009年华为一笔试题我写的一个递归算法

http://blog.csdn.net/challenge_c_plusplus/article/details/6640530

排列数的递归实现见我的另一篇

http://blog.csdn.net/challenge_c_plusplus/article/details/6574788

 /*
* 功能:输出组合数C(n,m)
* 日期:2011/7/28
* 作者:milo
* 不足:对于有多个重复数字,会输出重复的组合数,可以通过遍历一个数组链表解决。
*/ #include<stdio.h>
#include<stdlib.h> int *dst_array,top=,count=;//中间数组,存放中间求解过程,count计数所有的组合个数 //打印长度为n的数组元素
static void printA(int *parray,int n)
{
int i;
for(i=;i<n;i++){
printf("%d ",parray[i]);
}
} //递归打印组合数
static void print_combine(int *pArray,int n,int m)
{
if(n < m || m==) return ;//情况一:不符合条件,返回
print_combine(pArray+,n-,m);//情况二:不包含当前元素的所有的组合
dst_array[top++]=pArray[];//情况三:包含当前元素
if(m==){//情况三-1:截止到当前元素
printA(dst_array,top);
printf("\n");
count++;
top--;
return;
}
print_combine(pArray+,n-,m-);//情况三-2:包含当前元素但尚未截止
top--;//返回前恢复top值
} int main()
{
int n,m,*parray;//存放数据的数组,及n和m
scanf("%d%d",&n,&m);
parray=(int *)malloc(sizeof(int)*n);
dst_array=(int *)malloc(sizeof(int)*m);
int i;
for(i=;i<n;i++){//初始化数组
scanf("%d",&parray[i]);
}
print_combine(parray,n,m);//求数组中所有数的组合
printf("=====C(%d,%d)共计:%d个=====",n,m,count);
return ;
}

利用递归生成组合数C(n,m)的更多相关文章

  1. java作业利用递归解决问题

    第一题 利用递归求组合数 设计思想 (1)首先根据公式求,利用递归完成阶乘函数的初始化,并且通过调用阶乘,实现公式计算 (2)递推方法,根据杨辉三角的特点,设置二维数组,从上到下依次保存杨辉三角所得数 ...

  2. PHP利用递归法获取多级类别的树状数组

    数据结构:category(id, pid, name),对应:信息ID,父项ID,类别名 测试数据: $aryCate = array( array('id' => 1, 'pid' => ...

  3. uni-app图片压缩转base64位 利用递归来实现多张图片压缩

    //选择图片 chooseImage(){ let that =this uni.chooseImage({ sizeType: ['original','compressed'], //可以指定是原 ...

  4. Xml学习笔记(3)利用递归解析Xml文档添加到TreeView中

    利用递归解析Xml文档添加到TreeView中 private void Form1_Load(object sender, EventArgs e) { XmlDocument doc = new ...

  5. 利用递归分割(Split)字符串

    利用递归分割(Split)字符串 SqlServer 递归 工作需要将表里的某个字段分割之后再插入到另一个表中,其实数据量不大,直接用游标一行一行的取,再利用循环来分割之后再实现数据的插入应该可以直接 ...

  6. 利用递归,反射,注解等,手写Spring Ioc和Di 底层(分分钟喷倒面试官)了解一下

    再我们现在项目中Spring框架是目前各大公司必不可少的技术,而大家都知道去怎么使用Spring ,但是有很多人都不知道SpringIoc底层是如何工作的,而一个开发人员知道他的源码,底层工作原理,对 ...

  7. js利用递归与promise 按顺序请求数据

    问题:项目中有一个需求,一个tabBar下面如果没有内容就不让该tabBar显示,当然至于有没有内容,需要我们通过请求的来判断,但是由于请求是异步的,如何让请求按照tabBar的顺序进行? 方案:我们 ...

  8. JavaScript:利用递归实现对象深拷贝

    先来普及一下深拷贝和浅拷贝的区别浅拷贝:就是简单的复制,用等号即可完成 let a = {a: 1} let b = a 这就完成了一个浅拷贝但是当修改对象b的时候,我们发现对象a的值也被改变了 b. ...

  9. 【Python】利用递归函数调用方式,将所输入的字符串,以相反的顺序显示出来

    源代码: """ 利用递归函数调用方式,将所输入的字符串,以相反的顺序显示出来 string_reverse_output():反向输出字符串的自定义函数 pending ...

随机推荐

  1. 并非然并卵的z-index

    最近做一些东西的时候总觉得加上z-index和不加对于最终的显示结果并没有什么区别,开始以为一张图片把z-inde的值调小一点儿,就可以当做背景图片一样使用,跟background是一样的,在试过几次 ...

  2. Palindrome Number ---- LeetCode 009

    Determine whether an integer is a palindrome. Do this without extra space. Some hints: Could negativ ...

  3. Magento产品批量导入方法?

    从事外贸的我们在工作中,经常需要添加成千上万个的产品,如果一个一个的去上传,要花费很多时间,有是很让人头痛,那么应该如何实现产品批量上传?如果使用的是Magento系统的话,那么你现在有福利了,因为M ...

  4. 故事板(Storyboard) 、 iPad编程 、 App和VC的生命周期

    1 创建动态TableView 1.1 问题 动态表视图就是显示多少分区,多少行以及每一行的显示内容都是根据数据源来决定.之前我们学过用xib展示动态表视图,本案例将学习如何使用Storyboard展 ...

  5. JS操作DOM常用API总结

    <JS高程>中的DOM部分写的有些繁琐,还没勇气整理,直到看到了这篇博文 Javascript操作DOM常用API总结,顿时有了一种居高临下,一览全局的感觉.不过有时间还是得自己把书里面的 ...

  6. TruSeq 应该指的是试剂盒名字 NEB

    现在中心用的是NEB试剂盒,建库步骤更简单一些.TruSeq和NEB差不多,既可以建DNA又可以建RNA. TruSeq Technology     TruSeq technology repres ...

  7. UVa 10624 - Super Number

    题目大意 给定两个数n和m,如果长度为m的数满足对于每个i(n<=i<=m),数字的前i位都能被i整除,那么这个数就是超级数,求出字典序最小的符合要求的超级数. 分析 直接暴力搜索 #in ...

  8. Asp.net 执行回调操作后 无法更新ViewState的问题

    源码 待续...

  9. Java-->把txt中的所有字符按照码表值排序

    --> List 列表中的自动添加的多余空间长度该怎么去除呢?...(已解决,是char 数组中的空字符) package com.dragon.java.filesort; import ja ...

  10. 自动构建Makefile(1)--C/C++编译流程&Makefile规则简介

      前言: 大家在Windows上使用VS构建C/C++程序时,不需要自己编辑略显晦涩的Makefile文件,而对于初学者而言, 他们甚至没意识到它的存在.VS是自动生成Makefile文件, 并构建 ...