打印给定大小的集合的所有子集并计算子集

Print all subsets of given size of a set and count the subset

本文关键字:子集 计算 集合 打印      更新时间:2023-10-16

>生成具有不同元素的给定数组的大小 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

让我们用:next_permutation.这将排列输入,在访问完所有排列后返回false
给定排序后的输入:int arr[]我们可以执行以下操作:

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

现场示例

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