小白书之求无重复元素集合的子集

来源:互联网 发布:淘宝美工课程介绍 编辑:程序博客网 时间:2024/06/05 07:46

1:增量构造法:

一次选出一个元素放到集合中。

#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<string>#include<cctype>#include<cmath>#include<map>#include<set>#include<vector>#include<queue>#include<stack>#include<ctime>#include<algorithm>#include<climits>#define LL long longusing namespace std;const int N=101;int P[N];void print_subset(int n,int *A,int cur){    for(int i=0;i<cur;i++)        cout<<P[A[i]]<<' ';    cout<<endl;    int s=cur?A[cur-1]+1:0;    for(int i=s;i<n;i++)    {        A[cur]=i;        print_subset(n,A,cur+1);    }}int main(){    int n;    while(cin>>n)    {        int A[N];        for(int i=0;i<n;i++)            cin>>P[i];        print_subset(n,A,0);    }    return 0;}
2.位向量构造法:

#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<string>#include<cctype>#include<cmath>#include<map>#include<set>#include<vector>#include<queue>#include<stack>#include<ctime>#include<algorithm>#include<climits>#define LL long longusing namespace std;const int N=101;int P[N];void print_subset(int n,int *A,int cur){    if(cur==n)    {         for(int i=0;i<n;i++)         if(A[i])            cout<<P[i]<<' ';        cout<<endl;        return;    }    A[cur]=1;    print_subset(n,A,cur+1);    A[cur]=0;    print_subset(n,A,cur+1);}int main(){    int n;    while(cin>>n)    {        int A[N];        for(int i=0;i<n;i++)            cin>>P[i];        print_subset(n,A,0);    }    return 0;}
3.二进制法:

#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<string>#include<cctype>#include<cmath>#include<map>#include<set>#include<vector>#include<queue>#include<stack>#include<ctime>#include<algorithm>#include<climits>#define LL long longusing namespace std;const int N=101;int P[N];void print_subset(int n,int s){    for(int i=0;i<n;i++)        if(s&(1<<i)) cout<<P[i]<<' ';    cout<<endl;}int main(){    int n;    while(cin>>n)    {        int A[N];        for(int i=0;i<n;i++)            cin>>P[i];        for(int i=0;i<(1<<n);i++)            print_subset(n,i);    }    return 0;}


0 0