您的位置:首页 > 其它

枚举 子集生成

2012-08-07 18:24 260 查看
增量构造法

带给定数组P

void print_subset(int n, int *A,int *P, int cur, int pos)
{
int i;
for (i = 0; i < cur; i++)
{
printf("%d ", A[i]);
}
printf("\n");
if (pos < n - 1)
{
for (i = pos; i < n; i++)
{
if (!cur || A[cur - 1] != P[i])
{
A[cur] = P[i];
print_subset(n, A, P, cur + 1, i);
}
}
}

}


自然序列

void print_subset1(int n, int *A, int cur)
{
int i;
for (i = 0; i < cur; i++)  //打印当前集合
printf("%d ", A[i]);
printf("\n");
cnt++;
int s = cur ? A[cur - 1] + 1 : 0;
for (i = s; i < n; i++)
{
A[cur] = i;
print_subset1(n, A, cur + 1);
}

}


二进制位数表示非递归枚举方法

void print_subset2(int n, int s)
{
int i;
for (i = 0; i < n; i++)
{
if (s & (1 << i))
printf("%d ", i);
}
printf("\n");
cnt++;
}
for (i = 0; i < (1 << n); i++)
{
print_subset2(n, i);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: