C语言算法—(生成子集的升级)生成数据的全部组合(含重复数字)(类似建立树的回溯法)
2017-03-26 23:17
232 查看
继上篇文章(生成子集)之后,我们来看类似于此种算法的另一种功能算法:生成固定数据的全部组合;
先上算法:
我们可以看到,这个算法和生成子集算法的唯一不同只在于赋值top数组的不同而已;
我们其实可以看到,在生成子集程序中,其算法如下:
而我们可以将其改写成这样,就与上面的程序如出一辙了:
其寓意不过是,将top所代表的值的选择,在生成子集中,每一位只有显示或不显示两种选择,但在自由组合中,每一位都有n中组合;例如,在1,2,3中,每一位都有三种选择,为1,2,3,而在a中对应的则是0-2;所以在top记录数组中,每一位都可以赋值为0-2中的任意值;
而在输出中,我们可以看到的是,top数组指定的是这一位显示a数组中的哪一位,例如top[0]中显示的是1,则意味着第一个输出的数,是a数组中1号元素对应的数,若a[3]={1,2,3},则第一个元素应输出2,而不是1;
这就是为什么在输出中的形式应该是:a[top[i]];
先上算法:
#include<stdio.h> #include<malloc.h> int n; int sum; void build(int *a,int *top,int m) { if(m==n) { printf("{"); for(int i=0;i<n;++i) { printf("%d",a[top[i]]); } printf("}"); printf("\n"); return ; } for(int i=0;i<n;++i) { top[m]=i; build(a,top,m+1); } } int main() { scanf("%d",&n); int *a=(int *)malloc(sizeof(int)*n); for(int i=0;i<n;++i) scanf("%d",&a[i]); int *top=(int *)malloc(sizeof(int)*n); build(a,top,0); return 0; }
我们可以看到,这个算法和生成子集算法的唯一不同只在于赋值top数组的不同而已;
我们其实可以看到,在生成子集程序中,其算法如下:
而我们可以将其改写成这样,就与上面的程序如出一辙了:
for(int i=0;i<2;++i) { top =i; build(a,tag,n+1); }
其寓意不过是,将top所代表的值的选择,在生成子集中,每一位只有显示或不显示两种选择,但在自由组合中,每一位都有n中组合;例如,在1,2,3中,每一位都有三种选择,为1,2,3,而在a中对应的则是0-2;所以在top记录数组中,每一位都可以赋值为0-2中的任意值;
而在输出中,我们可以看到的是,top数组指定的是这一位显示a数组中的哪一位,例如top[0]中显示的是1,则意味着第一个输出的数,是a数组中1号元素对应的数,若a[3]={1,2,3},则第一个元素应输出2,而不是1;
这就是为什么在输出中的形式应该是:a[top[i]];
相关文章推荐
- 非重复生成全子集组合排列(含重复数字时,生成不重复全子集组合排列)
- 福彩双色球中红球由6个1-33之间的数字组合,且不重复,编写代码,使用Set集合来存储随机生成的1-33的数字,然后输出生成的数字
- 递归求解几类排列组合问题(六、非重复生成全子集组合排列)
- sql 生成8位字母数字组合不重复随机码
- 给定的数据,然后随机生成这些数据,并且保证数据全部都生成一遍,不回出现重复生成的情况
- 非重复组合排列(含重复数字时,生成不重复组合排列)
- 生成字符串+数字固定位数数据不重复方案设计
- python无限生成不重复(字母,数字,字符)组合
- 二者都是将 byte[] 转换成字符串,一个区别在于 Convert.ToBase64String 使用 base 64 数字编码,所以它生成的全部是 ASCII 字符。
- [组合算法] 生成不重复的字符串
- C#如何生成随机不重复的数字
- SQL2005系统升级手记之四-自动生成数据字典与系统表Sys.extended_properites
- asp.net 生成数字和字母组合的随机数
- 建立自己的ORM-从SQL2005中生成ORM数据类(.net)
- oracle中判断某列是否为数字,删除重复数据的方法
- 题目,得到某个数组,比如【1,2,3】 获得其全部的排列组合,包括1个数字的。2个数字的,和三个数字的等等
- 生成6位随机数字字母组合
- 在windows2003中数据表信息不能全部生成静态页面?
- 如何生成8位无重复的随机数(数字+字母)
- 用HashSet()实现重新建立一个没有重复数据的数组