正整数uniq的组合(顺序不重要)

时间:2012-09-20 22:25:31

标签: c++ algorithm combinations

所以,我正在为我的问题寻找一个好的解决方案。

我需要生成(打印)整数列表的所有组合,例如: 如果数组包含从0到n-1的整数,其中n = 5:

int array[] = {0,1,2,3,4};

组合中整数的顺序并不重要,意味着{1,1,3},{1,3,1}和{3,1,1}实际上是相同的组合,因为它们都包含一个3和两个。

所以对于上面的数组,长度为3的所有组合:

0,0,0 -> the 1st combination
0,0,1
0,0,2
0,0,3
0,0,4
0,1,1 -> this combination is 0,1,1, not 0,1,0 because we already have 0,0,1. 
0,1,2
0,1,3
0,1,4
0,2,2 -> this combination is 0,2,2, not 0,2,0 because we already have 0,0,2. 
0,2,3
.
.
0,4,4
1,1,1 -> this combination is 1,1,1, not 1,0,0 because we already have 0,0,1. 
1,1,2
1,1,3
1,1,4
1,2,2 -> this combination is 1,2,2, not 1,2,0 because we already have 0,1,2.
.
.
4,4,4 -> Last combination

现在我写了这样做的代码,但我的问题是: 如果数组中的数字不是从0到n-1的整数,那么假设数组是否像这样

int array[] = {1,3,6,7};

我的代码不适用于这种情况,任何用于解决此问题的算法或代码,

这是我的代码:

unsigned int next_combination(unsigned int *ar, int n, unsigned int k){
    unsigned int finished = 0;
    unsigned int changed = 0;
    unsigned int i;

    for (i = k - 1; !finished && !changed; i--) {
        if (ar[i] < n - 1) {
            /* Increment this element */
            ar[i]++;
            if (i < k - 1) {
                /* Make the elements after it the same */
                unsigned int j;
                for (j = i + 1; j < k; j++) {
                    ar[j] = ar[j - 1];
                }
            }
            changed = 1;
        }
        finished = i == 0;
    }
    if (!changed) {
        /* Reset to first combination */
        for (i = 0; i < k; i++){
            ar[i] = 0;
        }
    }
    return changed;
}

这是主要的:

int main(){
    unsigned int numbers[] = {0, 0, 0, 0, 0};
    const unsigned int k = 3;
    unsigned int n = 5;

    do{
        for(int i=0 ; i<k ; ++i)
            cout << numbers[i] << " ";
        cout << endl;
    }while (next_combination(numbers, n, k));

    return 0;
}

2 个答案:

答案 0 :(得分:2)

如果您有工作代码来生成从0n-1的所有数字组合,那么这很简单。你有一系列数字:

int array[] = {1,3,6,7};

现在,取n = 4,因为数组中有4个项目。生成从0到3的所有组合,并将它们用作数组的索引。现在,通过将索引的所有组合用于该数组,您可以获得数组值的所有组合。

答案 1 :(得分:0)

所以你需要程序来生成combination (wiki link)

这里有完整的说明,甚至可以使用算法:http://compprog.wordpress.com/2007/10/17/generating-combinations-1/