子集生成
阿新 • • 發佈:2018-02-07
子集生成 namespace esp mem ems str mes out pos
#include<iostream> #include<algorithm> #include<cstring> using namespace std; int vis[100]; int set[100]; int cpset[100]; int cmp(int a,int b){ return a>b; } void getSet(int n){ for(int i=0;i<n;i++){ cin>>set[i]; vis[set[i]]++; } sort(set,set+n,cmp); } void subset(int cnt,int n,int pos){ if(cnt){ for(int i=0;i<n;i++){ if(!i||(set[i]!=set[i-1])){ if(vis[set[i]]){ vis[set[i]]--; cpset[pos]=set[i]; subset(cnt-1,n,pos+1); vis[set[i]]++; } } } } else{ for(int i=0;i<n;i++){ if(cpset[i]) cout<<cpset[i]<<" "; } cout<<endl; } } int main(){ int n; while(cin>>n){ memset(vis,0,sizeof(vis)); memset(cpset,0,sizeof(cpset)); getSet(n); for(int i=1;i<n+1;i++){ subset(i,n,0); } } }
定序可避免重復!!!!
子集生成