算法竞赛入门经典:第七章 暴力求解法 7.8子集生成

来源:互联网 发布:淘宝怎么收钱 编辑:程序博客网 时间:2024/05/17 01:55
/*子集生成:给定一个集合,枚举它所有可能的子集。讨论范围:没有重复元素。增量构造法:一次选出一个元素放到集合中:*/#include <stdio.h>#include <stdlib.h>#define MAXSIZE 1024//每次递归调用都输出当前集合,递归边界也不需要显式确定--如果无法继续添加元素,就不再递归。void printPermutation(int n,int* iArr,int pos){//for(int i = 0 ; i < n ; i++)for(int i = 0 ; i < pos; i++)//打印初始序列,不是从头到尾打印,而是打印出到当前位置之前的所有元素,再确定下一个元素{printf("%d ",iArr[i]);//打印初始序列}putchar('\n');int iBeg = pos ? iArr[pos-1] + 1 : 0;//确定当前元素的最小可能值,定序技巧:规定集合A中所有元素的编号从小到大排列,就不会把(1,2)与(2,1)输出两次//for(int k = pos;k < n;k++)//for(int k = iBeg; k < n;k++){iArr[pos]  = k;//iArr[0] = 0,iArr[1] = 1,... printPermutation(n,iArr,pos+1);}}int main(int argc,char* argv[]){int iArr[MAXSIZE];//这个数组是需要初始化的int n;scanf("%d",&n);/*for(int i = 0 ; i < n ; i++){scanf("%d",&iArr[i]);}*/printPermutation(n,iArr,0);system("pause");return 0;}

0 0