元素集内选取组合
m 个元素内选取所有组合
要实现在给定的 m 个元素中选取所有可能的组合,可以使用递归和回溯的方法。以下是一个示例代码:
#include <stdio.h>
void generateCombinations(int arr[], int data[], int start, int end, int index, int r)
{
if (index == r)
{
for (int i = 0; i < r; i++)
{
printf("%d ", data[i]);
}
printf("\n");
return;
}
for (int i = start; i <= end; i++)
{
data[index] = arr[i];
generateCombinations(arr, data, i + 1, end, index + 1, r);
}
}
void printAllCombinations(int arr[], int n)
{
for (int r = 1; r <= n; r++)
{
int data[r];
generateCombinations(arr, data, 0, n - 1, 0, r);
}
}
int main()
{
int arr[] = {1, 2, 3, 4};
int n = sizeof(arr) / sizeof(arr[0]);
printAllCombinations(arr, n);
return 0;
}
在上述代码中,generateCombinations
函数使用递归和回溯的方法生成所有可能的组合。它接受一个数组arr
,一个辅助数组data
用于存储当前组合的元素,start
和end
表示当前递归的起始和结束位置,index
表示当前已选取的元素个数,r
表示目标选取的元素个数。
在每一层递归中,我们从start
到end
的范围内选择一个元素,并将其存储在data
数组中。然后递归调用generateCombinations
函数,将start
更新为当前选择的元素的下一个位置,index
增加 1,继续选择下一个元素。当index
等于r
时,表示已选取了目标个数的元素,将当前组合打印出来。
在printAllCombinations
函数中,我们使用一个循环来控制目标选取的元素个数r
,从 1 到 n 遍历所有可能的组合。
在示例中,给定数组arr
为 \{1, 2, 3, 4}\,代码会输出所有可能的组合,从 1 个元素到 4 个元素的组合。
你可以根据需要修改数组和元素个数来测试不同的情况。