查找组合数的算法

时间:2016-03-02 07:06:00

标签: c++ algorithm performance binomial-coefficients

我们说我有四个号码0,1,1,3。我想找两个号码的唯一组合数量。请帮我写一下算法和代码。 我知道这更像是一个数学问题,但我仍然需要编写代码。 请帮帮我。

3 个答案:

答案 0 :(得分:1)

从您的示例集0,1,1,3开始,我假设您要在输入中允许重复项,这样可以更加难以找到唯一组合的数量。

由于您只想选择唯一对,这比选择唯一的n组要简单得多(至少在允许重复时)。

我们的想法是首先删除所有重复项,同时保持多少输入具有重复值。

你的回答将是

n C 2 + m其中n是不同元素的数量,m是具有重复元素的元素数。

代表0,1,1,3n = 3m = 1所以你得到3 C 2 + 1 = 3 + 1 = 4

(0, 1), (0, 3), (1, 1), (1, 3)

下面的代码给出了一个实现,假设您的输入是一个int的向量。 但是您可以将int更改为已定义<的任何类型。

unsigned long long unique_pairs(const std::vector<int>& elements){
    std::map<int, int> counts;
    for (int i = 0; i < elements.size(); ++i){
        ++counts[elements[i]];
    }
    unsigned long long n = counts.size(); // # of different elements
    unsigned long long m(0);              // # of repeated elements
    for (std::map<int, int>::iterator it = counts.begin(); it != counts.end(); ++it){
        if (it->second != 1){
          ++m;
        }
    }
    return n * (n - 1) / 2 + m; // n C 2 + m
}

Demo

答案 1 :(得分:0)

您必须在其中使用组合公式。你应该为它写一个阶乘函数。

假设您有一个4个数字,并且您想要多个组合而不重复,请使用 4C2

此处2是您要组合使用的元素数量

4是您拥有的元素总数

所以你可以用 4解决这个问题! /(2!*(4-2)!) ....所以这个计算会给你没有重复的组合总数

注意:对于独特的组合,您应该有独特的元素

答案 2 :(得分:0)

一个简单的伪代码就是这样做:

1- getInputs(std::vector<int> inputs) //负责阅读用户的输入

2- removeDuplicates(std:vector<int> inputs) //删除输入中的重复项

3- calculateCombination(n = length(inputs)) //如果您正在寻找组合,则应实施n!/((n-2)!*2!),或者如果您正在寻找排列,则应实施n!/(n-2)!