c++组合数学

c++ combinatorics

本文关键字:组合 c++      更新时间:2023-10-16

我需要c++代码,它将生成所有可能的组合(n,k)和repositions其中n-输入数组中整数的数量。k-的位置数量

例如输入:

n = [1 2 3];
k = 2;

输出:

A3 =
     1     1
     1     2
     1     3
     2     1
     2     2
     2     3
     3     1
     3     2
     3     3

谢谢。

使用标准库:

do {
    for(int i = 0; i < k; i++){
        std::cout << n[i];
    }
    std::cout << 'n';
} while (std::next_permutation(n, n + k));

请在此处查看我的答案:

PHP接受所有组合

它是PHP;但这个概念(递归等)应该很容易"翻译"。。。

这基本上是以n-1为基数计数(其中每个数字都偏移1),请尝试以下操作:

编辑:使用vector而不是new[]delete[]

#include <vector>
void generatePerms(int n, int k)
{
    vector<int> perms(k, 1);
    //iterate through all permutations
    bool done;
    do {
        //Do something with the current permutation, for example print it:
        for (int i = 0; i < k-1; i++)
            cout << perms[i] << ", ";
        cout << perms[k-1] << endl;
        /*
         * Increment last digit first - if it's to big, reset to 1 and
         * carry one (increment next digit), which may also carry one etc.
         *
         * If all digits caused a carry, then the permutation was n, n, ..., n,
         * which means, that we can stop.
         */
        done = true;
        for (int i = k-1; i >= 0; i--) {
            if (++perms[i] > n) {
                perms[i] = 1;
                continue;
            } else {
                done = false; //not all digits caused carry
                break;
            }
        }
    } while (!done);
}