1.组合问题:
问题描述:对于一组各不相同的数字,从中任意抽取1-n个数字,构成一个新的集合。求出所有的可能的集合。例如,对于集合{1,2,3},其所有子集为{1},{2},{3},{1,2},{1,3},{2,3}{1,2,3}, 给定一个数组(元素各不相同),求出数组的元素的所有非空组合(即数组的所有非空子集)
解法一:位向量法。用一个辅助数组表示各个元素的状态。1表示在集合中,0表示不在数组中。递归地求解所有的子集。
算法描述如下://这里的算法对空集也输出了,可修改之使得只输出非空集合。
void getSubSet(int *a,int *b,int n,int k){
if(k==n){
for(int i = 0;i < n;i++){
if(i == 0){
printf("{ ");
}else if(i==(n-1)){
printf(" }\n");
}
if(b[i]){
printf("%d, ",a[i]);
}
}
return ;