C语言算法—生成数集的所有子集(类似建立树的回溯法)
来源:互联网 发布:coc亡灵升级数据 编辑:程序博客网 时间:2024/05/18 00:03
#include<stdio.h>#include<malloc.h>int N; void build(int *a,int *tag,int n){ if(n==N) { printf("{"); for(int i=0;i<N;++i) if(tag[i]==1) printf("%d",a[i]); printf("}"); printf("\n"); return ; } tag[n]=0;//标记为0之后,开始建立下一个 build(a,tag,n+1); tag[n]=1;//标记为1之后,开始建立下一个 build(a,tag,n+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 tag[N]; build(a,tag,0); return 0;}
这种生成数集子集的方法,类似于生成二叉树的方式;
用一个只显示0,1的数组,来表示该位是否显示;而每一位都有0,1两种选择,在每一位选择结束之后,开始以同样的方式来建立其下一个元素(子树);
而递归结束的条件则是,当n==N时,递归结束;
所以这种写法的主要思路,就是像树一样分支讨论情况。
图片为建立以1,2数集为子集的生成过程:
0 0
- C语言算法—生成数集的所有子集(类似建立树的回溯法)
- C语言算法—(生成子集的升级)生成数据的全部组合(含重复数字)(类似建立树的回溯法)
- C语言算法—(生成数字的组合升级)生成数据的全排列(类似建立树的回溯法)
- 回溯法求集合的所有子集
- 穷举所有子集的算法
- C语言递归求解集合的所有子集
- 输出集合的所有子集(幂集)-C语言
- 生成所有的出栈序列 (回溯法)
- ACM:回溯法,子集生成
- 回溯法 求所有子集 所有排列
- 生成一个整数集合的所有子集
- 生成一个集合的所有子集 Subset
- 生成所有子集的三种方法
- 生成一个集合的所有子集 Subset
- 运用二进制生成集合的所有子集
- 递归枚举,子集生成,排列生成,回溯都是解决解答树的方法
- 回溯法求数字1,2,……n 的所有子集
- 求集合的所有子集的算法
- spring cloud config统一配置中心
- Android notifyDatasetChanged失效
- SQL-(4) 约束
- 动态批量删除
- Mat 矩阵的叉乘与点乘
- C语言算法—生成数集的所有子集(类似建立树的回溯法)
- UVa_Maximum Product
- Java对象序列化
- 实例讲解C++中CopyFileEx函数的简单用法
- VRTK插件详解二:交互之事件与委托分析
- Java问题异常
- Openfire服务端源代码开发配置
- 关于使用C#编写一个简单的日志类
- Number lengths(数学,N!的位数)