紫书7.3 子集生成

1.增量构造法

k1 数组 存放集合元素

pos数组 来存放子集中遍历元素的位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include<iostream>
#include<stdio.h>
#include<cstring>
using namespace std;
int n;
int k1[10];//存放具体数据
int pos[10];//存放每次查找下一个元素的在集合k1中元素的具体位置

void add_cl (int cur)//从一定程度上,我们可以这么理解cur参数:即cur是我们进行图的遍历的层数
{
if(cur != 0)
{
for (int i=0;i<cur; i++)
{
cout<<k1[pos[i]];
}
cout<<endl;
}


int dingwei = cur ? pos[cur-1] + 1 : 0;


for (int i=dingwei;i<n;i++)
{
pos[cur] = i;
cout<<"pos:"<<pos[cur]<<endl;
add_cl(cur+1);
}
}

int main ()
{
while (cin>>n)
{
memset(k1,0,sizeof(k1));
memset(pos,0,sizeof(pos));
for (int i=0;i<n;i++)
{
cin>>k1[i];
}
add_cl (0);
}
return 0;
}

2.二进制法
用二进制表示子集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include<cstring>
using namespace std;
int a[20];
int n;
void check(int s){
for(int i=0;i<n;i++){
if(s&(1<<i)) cout<<i<<" ";

}cout<<endl;
}
int main ()
{
cin>>n;
for(int i=0;i<(1<<n);i++)
check(i);

return 0;
}