7.3.1 增量构造法
- 输入n,生成n的子集(包括0)。运用了定序的技巧,不会把集合输出两次。
- 解答树计算方面:因为是集合,所以$2^n$个节点。集合的元素2^n
c
#include <stdio.h>
#include <algorithm>
using namespace std;
void print_subset(int n, int *a, int cur)
{
for(int i = 0; i < cur; i ++) printf("%d ", a[i]);
printf("\n");
int s = cur ? a[cur-1]+1 : 0;
for(int i = s; i < n; i++)
{
a[cur] = i;
print_subset(n, a, cur+1);
}
}
const int maxn = 1000;
int main()
{
int n;
int a[maxn];
while(~scanf("%d", &n))
{
for(int i = 0; i < n; i++) a[i] = i;
print_subset(n, a, 0);
}
return 0;
}
位向量法
c
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
const int maxn = 10000;
// 位向量
void print_subset(int n, int *b, int cur)
{
if(cur == n)
{
for(int i = 0; i < cur; i++)
if(b[i]) printf("%d", i);
printf("\n");
return;
}
b[cur] = 1;
print_subset(n, b, cur+1);
b[cur] = 0;
print_subset(n, b, cur+1);
}
int main()
{
int n;
int b[maxn];
while(~scanf("%d", &n))
{
memset(b, 0, sizeof(b));
print_subset(n, b, 0);
}
return 0;
}
二进制法
c
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
const int maxn = 10000;
void print_subset(int n, int s)
{
for(int i = 0; i < n; i++)
if(s & (1 << i)) printf("%d ", i);
printf("\n");
}
int main()
{
int n;
int b[maxn];
while(~scanf("%d", &n))
{
memset(b, 0, sizeof(b));
for(int i = 0; i < (1<<n); i++)
print_subset(n, i);
print_subset(n, 0);
}
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。