查找组合数的算法
Algorithm to find number of combinations
假设我有四个数字0,1,1,3
。我想找到两个数字的唯一组合数。请帮我编写算法和代码。我知道这更像是一个数学问题,但我仍然必须编写代码。请帮助我。
从您的示例集0,1,1,3
,我假设您希望在输入中允许重复项,这使得查找唯一组合的数量变得更加困难。
由于您只想选择唯一的对,这比选择唯一的 n 组要简单得多(至少在允许重复的情况下)。
这个想法是首先删除所有重复项,同时保留有多少输入具有重复值。
你的答案将是
n C 2 + m
其中n
是不同元素的 #,m
是具有重复元素的 #。
对于0,1,1,3
,n = 3
和m = 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
}
演示
一个简单的伪代码是像这样做:
1- getInputs(std::vector<int> inputs)
//负责读取用户的输入
2- removeDuplicates(std:vector<int> inputs)
//从输入中删除重复项
3- calculateCombination(n = length(inputs))
//如果你正在寻找组合,你应该实现n!/((n-2)!*2!)
或者如果你正在寻找排列,你应该实现n!/(n-2)!
您必须在其中使用组合公式。你应该为它写一个阶乘函数。
例如,假设您有一个 4 个数字,并且您想要不重复的组合数,因此请使用 4C2
这里 2 表示您要组合使用的元素数量
4 是您拥有的元素总数
所以你可以用4来解决这个问题!/(2!*(4-2)!) ....因此,此计算将为您提供组合的总数,而不会重复
注意:对于独特的组合,您应该具有独特的元素
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 计算数组重复次数的组合的有效算法,加起来达到给定的总和
- 为 C++11 算法组合多个谓词
- 双重释放或损坏(输出):使用向量的组合算法0x0000000001a880a0***
- Python到C++:使用递归列出背包的所有组合的算法
- 从给定的 IPv6:端口列表中搜索 IPv6:端口组合的最快搜索算法是什么 O(1) 时间一致性
- 给定数字与重复的组合的算法?C
- 排列和组合生成算法
- 加密++对称算法和经过身份验证的块模式组合
- 所有的组合算法和解决C++问题的一般方法
- 按字典顺序打印给定字符串的所有字母组合的算法
- 生成每个可能的 7 位数字组合的算法
- 运行整数数组所有组合的算法
- 根据组合框中的选定项目选择算法
- C++算法优化:从N个元素中求出K组合
- 递归算法将所有组合分成两组
- 数组算法的组合
- 按类型算法的列表组合
- 一个很好的算法来获得元素的闲置组合
- 是硬币变化算法,输出仍可由DP解决的所有组合