1. 程式人生 > >子集生成

子集生成

子集生成 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); } } }

定序可避免重復!!!!

子集生成