子集生成与字典序
题目描述 请编写一个方法,返回某集合的所有非空子集。 给定一个int数组A和数组的大小int n,请返回A的所有非空子集。保证A的元素个数小于等于20,且元素互异。各子集内部从大到小排序,子集之间字典逆序排序,见样例。 测试样例: [123,456,789] 返回:{[789,456,123],[789,456],[789,123],[789],[456 123],[456],[123]}
当数组内的元素是字典序排列,则生成子集时用位向量法生成的子集也是按字典序生成的;
#include<cstdio> #include<iostream> #include<string> #include<algorithm> #include<cctype> #include<functional> using namespace std; int flag=0,cnt=0,a[100]={0},num[10]={0}; /*void print_set(int n,int cur,int *num){ for(int i=0;i<cur;i++)printf("%d ",a[num[i]]); printf("\n"); int s=cur? num[cur-1]+1:0; for(int i=s; i<n;i++){ num[cur]=i; print_set(n,cur+1,num); } } */ void print_set(int n,int cur,int *num,int fleg){ //cout<<fleg<<endl; if(cur==n){ if(!fleg)return; flag=0; if(cnt)printf(","); printf("["); for(int i=0;i<n;i++){ if(num[i]&&flag)printf(","); if(num[i])printf("%d",a[i]); if(num[i])flag++; } printf("]"); cnt++; return; } num[cur]=1; print_set(n,cur+1,num,1); num[cur]=0; print_set(n,cur+1,num,fleg); } int main(){ int j,i; string s; cin>>s; //数组赋值 for(j=0,i=0;i<s.size();i++){ if(isdigit(s[i]))a[j]=10*a[j]+s[i]-'0'; if(s[i]==',')j++; } sort(a,a+j+1,greater<int>()); //printf("%d",a[0]); printf("{"); print_set(3,0,num,0); printf("}\n") ; return 0; }