子集生成

分析:子集不是全排列,子集与二进制先关,

1.位向量法 b[i]做标记

#include<iostream>
using namespace std;
int b[100]={0};
void gcd(char *s,int n,int *b,int cur){
    int i;
    if(cur==n){
        for(i=0;i<n;i++) if(b[i]) printf("%c",s[i]);
        cout<<endl;
        return;
    }
    b[cur]=0;
    gcd(s,n,b,cur+1);
    b[cur]=1;
    gcd(s,n,b,cur+1);
}
int main()
{
    int i,j;
    char s[100];
//    int p[100]={0};
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>s[i];
    }
    gcd(s,n,b,0);
}
View Code

2.二进制法则

#include<iostream>
using namespace std;
void gcd(string s,int n){
    int i,j;
    for(i=1;i<(1<<n);i++){
        for(j=0;j<n;j++){
            if(i&(1<<j)) cout<<s[j];//实验一下printf输出 
//            cout<<endl;
        }
        cout<<endl;
    }
}
int main()
{
    int n,i,len;
    string s;
    while(cin>>s){
        len=s.length();
        gcd(s,len);
    }
}
View Code
原文地址:https://www.cnblogs.com/helloworld2019/p/10484160.html