算法——使用递归解决组合问题
来源:互联网 发布:电路仿真软件j 编辑:程序博客网 时间:2024/06/04 22:46
从n个数中取m个数,打印所有可能的结果。
思想:把一个大问题分解成很多小问题。先从n个数中取一个,再从取出的这个数序列后面的数中取一个,再从新取出的这个数的序列后面的数中取一个,以此类推,直到只用取一个数,那么只要从剩下的序列中依次取结果就可以了。简单的讲,就是我们高中数学写全组合的次序方法,例如取3个数,就先确定前两个数不变,最后一个依次取序列中的数,取完后再变第2个数,最后都取完后改变第1个数。距离:从6个数中取3个,即为:1 2 31 2 41 2 51 2 61 3 41 3 51 3 61 4 51 4 61 5 62 3 42 3 52 3 62 4 52 4 62 5 63 4 53 4 63 5 64 5 6
C语言代码如下:
#include <stdio.h>#include <malloc.h>#include <stdlib.h>int combine(int n,int m,int *data,int *getComb,int len){ if(m>n||m<1||n<1){ printf("ERROR!\n"); return 1; } int i,j; if(m==1){ for(i=0;i<n;i++){ getComb[len-m]=data[i]; for(j=0;j<len;j++) printf("%3d",getComb[j]); printf("\n\n"); } return 0; } for(i=0;i<n-m+1;i++){ getComb[len-m]=data[i]; combine(n-i-1,m-1,data+i+1,getComb,len); }}//从共有n个元素的数列中取出m个元素 int main(){ int n,m,i; int *data,*getComb; printf("从n个数中取m个\n请输入n:"); scanf("%d",&n); printf("请输入m:"); scanf("%d",&m); //输入数列 data=(int*)malloc(n*sizeof(int)); getComb=(int*)malloc(m*sizeof(int)); printf("请输入数列:"); for(i=0;i<n;i++){ scanf("%d",&data[i]); } //取出数列并打印 printf("则取出m个数共有以下几种组合:"); combine(n,m,data,getComb,m); return 0;}
阅读全文
0 0
- 算法——使用递归解决组合问题
- 使用递归算法解决字符的组合问题
- 非递归解决组合问题
- 非递归解决组合问题
- 使用非递归算法解决迷宫问题
- 递归与非递归解决组合问题
- 回溯法解决组合与数的问题(递归与非递归算法)
- 算法第三节:使用递归算法解决“阶乘”问题
- 算法——递归思想解决排列组合问题
- 组合问题的递归方式解决
- 【算法】 组合数问题非递归解法
- 算法学习-组合问题递归解法
- 算法——递归生成集合的所有组合
- 组合数算法-解决溢出问题
- 全组合 递归算法~
- ////////////////递归求组合算法//////////////
- 组合的递归算法
- 组合的递归算法
- Roadblocks
- HTML解析原理
- 第一篇博客
- 第二周项目3(2)---汉诺塔程序
- RPC框架调用过程详解
- 算法——使用递归解决组合问题
- bootstrap时间控件
- 算法导论——集合S是否存在两个元素相加之和等于x
- NOI模拟:第k大(点分治)
- Calico 的网络结构是什么?- 每天5分钟玩转 Docker 容器技术(68)
- javaWEB乱码根源于解决方法
- POJ 2411 Mondriaan's Dream 轮廓线动态规划,插头dp,滚动数组
- Python网络编程
- 逻辑卷管理员(Logical Volume Manager)介绍