n個不同整數的所有子集(遞歸輸出)

題目描述

計算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;
}

運行結果

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章