您的位置:首页 > 其它

读《算法竞赛入门经典》 7.3子集生成

2013-03-07 23:53 148 查看

7.31 增量构造法

void print_subset1(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;	//当第一次调用,cur为0,s赋值0
for(i = s;i < n;i++)
{
A[cur] = i;					//加入一个数
print_subset1(n,A,cur+1);
}
}


增量构造法,顾名思义,每次添加一个元素,然后输出.

7.32 位向量法

void print_subset2(int n,int *B,int cur)
{
if(cur == n)	//当B[0]到B[n-1]全部赋值完毕,输出
{
for(int i = 0;i < n;i++)
if(B[i])	printf("%d ",i);	//B[i]为1或0
printf("\n");
return;
}
else
{
B[cur] = 0;					//加入第cur个元素
print_subset2(n,B,cur+1);
B[cur] = 1;					//不加入第cur个元素
print_subset2(n,B,cur+1);
}
}


B[i]表征i是否加入集合,当数组B[n-1]全部赋值完毕,输出集合.

7.33二进制法

同7.32,不过使用二进制来表示子集,类似于离散数学的真值表.

void print_subset3(int n,int s)
{
for(int i = 0;i < n;i++)
if(s&(1<<i))	printf("%d ",i);
printf("\n");
}
int main()
{
int n;
scanf("%d",&n);
for(int i = 0;i < (1<<n);i++)
print_subset(n,i);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: