繁体   English   中英

查找组合数量的算法

[英]Algorithm to find number of combinations

假设我有四个数字0,1,1,3 我想找到两个数字唯一组合的数字。 请帮助我编写此算法和代码。 我知道这更多是一个数学问题,但仍然必须编写代码。 请帮我。

根据您的示例集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更改为具有<定义的任何类型。

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
}

演示版

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

例如,假设您有4个数字,并且想要组合的数量不重复,那么使用4C2

这里2是要组合使用的元素数

4是您拥有的元素总数

因此您可以使用4解决此问题 /(2!*(4-2)!) ....因此此计算将为您提供组合总数,而无需重复

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

一个简单的伪代码对您来说是这样的:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM