任意集合的子集生成--C++實現
阿新 • • 發佈:2019-02-09
題目描述:
任意給定一個集合,集合中不含相同元素,要求打印出該集合所有的子集。
輸入描述:
第一行輸入該集合的元素個數。第二行輸入該集合的所有元素。
輸出描述:
按照字典序從小到大輸出該集合的所有子集。
樣例輸入:
5
1 6 5 3 2
樣例輸出:
1
1 2
1 2 3
1 2 3 5
1 2 3 5 6
1 2 3 6
1 2 5
1 2 5 6
1 2 6
1 3
1 3 5
1 3 5 6
1 3 6
1 5
1 5 6
1 6
2
2 3
2 3 5
2 3 5 6
2 3 6
2 5
2 5 6
2 6
3
3 5
3 5 6
3 6
5
5 6
6
解題思路:
每次在p(輸入集合)中拿出一個符合條件的元素放入rslt(輸出集合)中,符合條件的元素是指該元素比rslt中的任意一個元素都要大。然後利用遞迴構造子集。具體實現請看程式碼。
#include <iostream> #include <algorithm> using namespace std; void print_subset(int n,int p[],int rslt[],int cur) { for(int i=0;i<cur;i++)cout<<rslt[i]<<' ';//列印當前集合 int s; if(cur==0)s=0; else { s=rslt[cur-1]; cout<<'\n'; } if(s<p[n-1])//當集合rslt中的最大元素小於p中的最大元素時,進行下一步 { for(int i=0;i<n;i++) { if(p[i]>s) { rslt[cur]=p[i]; print_subset(n,p,rslt,cur+1);//遞迴構造子集 } } } } int main() { int n;cin>>n; int p[n]; for(int i=0;i<n;i++)cin>>p[i]; int rslt[n]={0}; sort(p,p+n);//將集合中的元素按升序排列好 print_subset(n,p,rslt,0); }