打印一组给定大小的所有子集并计算该子集

时间:2019-09-15 18:25:58

标签: c++

使用不同的元素生成给定数组大小r的所有可能子集。 在获得具有不同元素的给定数组的大小r的所有可能子集后,我需要帮助计算子集。生成后如何计算不同元素的子集

    #include <bits/stdc++.h> 
    using namespace std;
    void combinationUtil(int arr[], int n, int r, int index, int data[], int i); 

    void printCombination(int arr[], int n, int r) 
    { 
        int data[r]; 

        combinationUtil(arr, n, r, 0, data, 0); 
    } 
    void combinationUtil(int arr[], int n, int r, int index,int data[], int i) 
    { 
        int c=0; 
        if (index == r) { 
            for (int j = 0; j < r; j++) {
                printf("%d ", data[j]); 
            }
            printf("\n"); 
            return; 
        } 

        if (i >= n) 
            return; 

        data[index] = arr[i]; 
        combinationUtil(arr, n, r, index + 1, data, i + 1); 
        combinationUtil(arr, n, r, index, data, i + 1); 
    } 

    int main() 
    { 
        int arr[] = { 0,1,2,3,4}; 
        int r = 2; 
        int n = sizeof(arr) / sizeof(arr[0]); 
        printCombination(arr, n, r); 
        return 0; 
    }

output 
0 1
0 2
0 3
0 4
1 2
1 3
1 4
2 3
2 4
3 4
number of subset 10

1 个答案:

答案 0 :(得分:0)

让我们用next_permutation解决这个问题。这将置换输入,在访问所有置换后返回false
给定排序的输入:int arr[],我们可以做到:

do {
    copy(cbegin(arr), cend(arr), ostream_iterator<int>(cout, " "));
    cout << endl;
} while(next_permutation(begin(arr), end(arr)));

Live Example

此示例假定唯一的输入,在这种情况下,组合和排列是相同的。如果您没有唯一的输入,您实际上是在要求这些数字的组合next_combination的目的是在这里:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2639.pdf如果发现您没有唯一的输入并且可以使用它,则可以复制该实现。您还可以在这里找到有关next_combination的更多信息:https://stackoverflow.com/a/35215540/2642059