題目描述
計算n個不同整數的所有子集
輸入
第1行是一個整數m,表示隨後有m組數據。
每組數據佔一行,第一個整數n表示隨後有n個不同的整數。
輸出
對每組數據,輸出這n個不同整數的不同組合,含空組合。每個組合輸出前輸出“–> ”。
要求必須按照上課講的遞歸方法來寫,先輸出包含該元素的情況,再輸出不包含的情況,這樣才能保證輸出順序和標準答案一致。
樣例
輸入
2
2 1 2
3 1 2 3
輸出
–> 1 2
–> 1
–> 2
–>
–> 1 2 3
–> 1 2
–> 1 3
–> 1
–> 2 3
–> 2
–> 3
–>
代碼
#include <cstring>
#include <iostream>
using namespace std;
void subset(int list[], int tag[], int n,int len) //生成子集 共2^n個
{
if (n == len)
{
cout << "-->";
for (int i = 0; i < len; i++)
{
if (tag[i] == 1)
cout <<' '<< list[i];
}
cout<<endl;
return;
}
tag[n] = 1;
subset(list, tag, n + 1,len);
tag[n] = 0;
subset(list, tag, n + 1,len);
}
int main()
{
//cout << "請您輸入整數的個數:";
int m;
cin>>m;
while(m--)
{
int n;
cin >> n;
int *number = new int[n];
int *tag = new int[n];
for (int i = 0; i < n; i++)
{
cin >> number[i];
}
// for (int i = 0; i < n; i++)
// {
// cout << number[i];
// }
// cout<<endl;
//memset(tag,1,sizeof(tag[0])*n);
// for (int i = 0; i < n; i++)
// {
// cout << tag[i]<<endl;
// }
subset(number, tag, 0,n);
}
//system("pause");
return 0;
}