/*=====================================
数的组合问题。从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. linux命令:rm

    1.介绍: rm用来删除文件或者目录,对于链接文件,只删除了链接,不删除源文件.rm是一个非常危险的命令,像rm -rf /这个命令运行后,后果不堪设想. 2.命令格式: rm [选项] 文件/目录 ...

  2. Xen虚拟机磁盘镜像模板制作(一)—Windows Server 2008(2012)

    这段时间一直在研究如何制作一个适合Xen虚拟化的Windows Server 2008(2012)磁盘镜像,中间虽然遇到了一些阻挠,不过最终还是顺利解决,成功制作出了Xen Windows Serve ...

  3. 260. Single Number III

    Given an array of numbers nums, in which exactly two elements appear only once and all the other ele ...

  4. Spring Data Jpa 详解

    前言: JPA全称Java Persistence API,即Java持久化API,它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据,结合其他ORM的使用,能达到简化开发 ...

  5. c 函数及指针学习 5

    聚合数据类型 能够同时存储超过一个的单独数据. c语言提供了数组和结构体. 1. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include <stdio.h> # ...

  6. T语言TC发布脚本方法

    代码模式的注册码发布脚本方法 注册码项目模式的发布脚本方法 1.注册码项目发布版 2.注册码项目代理版 这两种方法都是基于注册码项目来实现的,所以在使用之前,需要先创建注册码项目.

  7. 转:db2 iptables相关用法(1)

    如果你的IPTABLES基础知识还不了解,建议先去看看. 开始配置 我们来配置一个filter表的防火墙. (1)查看本机关于IPTABLES的设置情况 [root@tp ~]# iptables - ...

  8. leetcode 149. Max Points on a Line --------- java

    Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. ...

  9. Codeforces Round #123 (Div. 2)

    A. Let's Watch Football 记时间为\(t\), 则\(bt+(b-a)c>=0\),可得\[t \ge \frac{c(a-b)}{b}\] B. After Traini ...

  10. timus 1982 Electrification Plan(最小生成树)

    Electrification Plan Time limit: 0.5 secondMemory limit: 64 MB Some country has n cities. The govern ...