组合C代码用于随机整数集

时间:2011-09-19 01:40:23

标签: c algorithm combinations

我有一个随机集S = {3,12,15,24,33,40},我需要从这个集合中生成大小为3的子集。大多数示例和关于组合的解释涉及一组增加和有序值,如S1 = {1,2,3,4,... n}。使用组合公式,我发现可能的组合数是20,但无法弄清楚如何在C中生成该列表。

如果该集合像上面的S一样是随机的,如何在C中获得没有重复的可能列表?

感谢。

4 个答案:

答案 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=0needed=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阵列将具有所有可能的数字组合而无需重复