我有一个随机集S = {3,12,15,24,33,40},我需要从这个集合中生成大小为3的子集。大多数示例和关于组合的解释涉及一组增加和有序值,如S1 = {1,2,3,4,... n}。使用组合公式,我发现可能的组合数是20,但无法弄清楚如何在C中生成该列表。
如果该集合像上面的S一样是随机的,如何在C中获得没有重复的可能列表?
感谢。
答案 0 :(得分:2)
使用您看到的具有增加的有序值的算法,并简单地用列表中的值替换它们。
例如,组合(0索引)将是:
0, 1, 2
0, 1, 3
0, 1, 4
...
...
然后有一个数字
的数组int array[] = { ...values... };
并将组合更改为:
array[0], array[1], array[2]
array[0], array[1], array[3]
...
...
答案 1 :(得分:1)
您可以递归地生成n个项目的所有组合。这样的事情应该有效:
void combos(int[] values, int[] used, int[] selected, int len, int needed, int next) {
int i;
if (needed > 0) {
/* select each available item as the next item and recurse */
for (i = 0; i < len; i++) {
if (!used[i]) {
used[i] = 1;
selected[next] = values[i];
combos(values, used, selected, len, needed-1, next+1);
used[i] = 0;
}
}
} else {
/* selected[0] .. selected[next-1] contains a combination */
reportCombination(selected, next);
}
}
使用next=0
和needed=3
调用此选项可以让球滚动,它应该生成20个reportCombination
的调用,每个调用都有3个值的唯一组合。 (如果你需要收集所有组合的数组,那么你不需要reportCombination
,但是你需要额外的簿记参数或者一些全局变量。)
答案 2 :(得分:0)
您要求按惯例 P(S)调用的 S Power set的子集 - 即Power中的所有三元素集设置 P(S)。
您可以修改this C code example中的电源设置功能,以输出特定基数(计数)的集合。
答案 3 :(得分:0)
通过删除重复,再次使用相同集的笛卡尔积, 试试这段代码,
int array[6]={3,12,15,24,33,40};
int combinations[20][3];
int n=0;
for(i=0;i<4;i++)
{ //loops for 1st num in combination
for(j=i+1;j<5;j++)
{ //loops for 2nd num in combination
for(k=j+1;k<6;k++)
{ //loops for 3rd num in combination
combinations[n++]={array[i],array[j],array[k]};
}
}
}
最后,组合2D阵列将具有所有可能的数字组合而无需重复