问题:输出$[0,1,2,3,...n)$的所有子集。 1. 增量构造法:一次选出一个元素放到集合中。由于$A$中的元素个数不确定,每次递归调用都要输出当前集合。另外,递归边界也不需要显示确定——如果无法继续添加元素,自然就不会递归了。 2. 位向量法:构造一个位向量$B[i]$,而不是直接构造子集 ...
分类:
其他好文 时间:
2019-10-16 16:18:32
阅读次数:
115
1.增量构造法: 原理图: 2.位向量法: 构造一个位向量,而不是直接构造子集本身 位向量的解答树如图: 3.二进制法: 还可以用二进制来表示{0,1,2······,n-1}的子集S:从右往左第i位(各位从0开始编号)表示i是否在集合S中,图中展示了二进制0100011000110111是如何表示 ...
分类:
其他好文 时间:
2019-03-03 20:40:55
阅读次数:
182
两种方法: 1.增量构造法 2.位向量法 (ps:懒得分开写就写一起了) 还有一种二进制法由于我不会某些原因以后懒得补上 先献上图片 ...
分类:
其他好文 时间:
2018-02-27 23:46:16
阅读次数:
223
方法一:增量构造法 理解递归必须得理解函数到底是做什么的。 方法二:位向量法 枚举每一位选或者不选,复杂度比方法一略高但更好理解,因为与输出全排列思路差不多,满n位就输出。 缺点是输出不是按照字典序。 方法三:二进制法 稍加思考就会发现,方法二其实与二进制是对应的。 这个方法优点就是代码简单。 注意 ...
分类:
编程语言 时间:
2017-12-31 12:56:41
阅读次数:
203
7.3.1增量构造法 思路:一次选出一个元素放到集合中。自己对于递归的理解还是不够,这里虽然没有明确给出递归停止条件,但是如果无法继续添加元素,就不会再继续递归,然后就是我头疼的回溯啦。 7.3.2位向量法 思路:构造一个位向量a[i],如果a[i]=1,当且仅当i在集合子集a中。 7.3.3二进制 ...
分类:
编程语言 时间:
2017-08-29 18:05:18
阅读次数:
266
紫书188子集生成,当时看不懂给跳过去了== 生成从0到n-1, n个数的子集 增量构造法,一次选出一个元素放到集合中,感觉是深度优先遍历解答树 甚至看输出能脑补递归的过程== 位向量法 其实就是用一个开关数组B,B【i】= 0或1表示子集中含不含i 有点回溯法的意思,输出是这样的 二进制法 位向量 ...
分类:
其他好文 时间:
2017-06-04 15:42:50
阅读次数:
155
#include<iostream>#include<cstdio>using namespace std; int s,t,w,a[30],time=5;char c[30];bool ok;//ok表示是否找到规定集合; void data_in()//使用位向量法; { scanf("%d%d ...
分类:
编程语言 时间:
2016-11-12 19:43:02
阅读次数:
470
方法一:增量构造法 理解递归必须得理解函数到底是做什么的。 方法二:位向量法 枚举每一位选或者不选,复杂度比方法一略高但更好理解,因为与输出全排列思路差不多,满n位就输出。 缺点是输出不是按照字典序。 方法三:二进制法 稍加思考就会发现,方法二其实与二进制是对应的。 这个方法优点就是代码简单。 注意 ...
分类:
编程语言 时间:
2016-07-30 14:53:34
阅读次数:
519
#include
#include
#include
using namespace std;
int ans[6],n;
void dfs(int cnt)
{
int i,j;
if(cnt==n) {
for(i=0;i<n;i++) if(ans[i]) cout<<i<<" ";
cout<<endl;
return ;
}
ans[cnt]=1;
dfs(cnt...
分类:
其他好文 时间:
2015-08-20 13:05:49
阅读次数:
149