使用多个求和查找有序集的组合数
Find number of combinations of ordered set using multiple summations
这是关于查找有序集合的多个组合的问题,其中元素具有约束。
举个例子:
a+b+c+d+e=635,可能是...
[0-90] + [1-120] + [50-150] + [20-200] + [30-250] = 635
一个解决方案使用多个求和,就像在数学堆栈交换中回答的那样。
https://math.stackexchange.com/questions/159197/combinatorics-using-constraints-and-ordered-set
有人可以大致了解解决此类问题的过程或伪代码吗?
谢谢!
一堆嵌套的 for 循环是最简单的方法。
伪代码:
let combinations = 0;
for a = 0 to 90
for b = max(a+1, 1) to 120
for c = max(b+1, 50) to 150
for d = max(c+1, 20) to 200
let e = 635 - a - b - c - d;
if max(d+1, 50) <= e <= 250
let combinations = combinations + 1
更新
以上可以稍微优化一下,但你最终会得到一个特定的,而不是通用的解决方案。
您可以观察到(a+1) >= 1
总是正确的,因此我们可以摆脱分配给b
的max
调用。 同样,(c+1) >= 20
始终为真,因此可以简化对d
的分配。
您还可以看到 a + b + c + d
的最大可能值为 540,这给出了 e
的最小可能值 95。 这大于规定的e
下限,所以我们只需要检查该e >= (d+1)
。
我们最终得到:
let combinations = 0;
for a = 0 to 90
for b = a+1 to 120
for c = max(b+1, 50) to 150
for d = c+1 to 200
let e = 635 - a - b - c - d;
if d+1 <= e <= 250
let combinations = combinations + 1
看看数学交换页面上发布的解决方案。 每个 sigma 符号都是一个嵌套的for
循环。 最里面的项,x
,是作为if
给出的。 因此,您的算法应该是围绕 if 的四个嵌套循环。
相关文章:
- 从给定字符串中查找长度 k 的所有排列/组合
- 为什么查找 + 插入的组合比单个插入语句工作得更快
- 查找使用并行线程加总数的所有组合
- 快速的唯一组合(来自重复项列表),无需查找
- 查找有关当前键盘布局的字符的可能键组合
- 嵌套c++11范围循环,用于查找组合
- 将两个双数组集组合为一个查找其并集和交集的最简单方法
- 查找存储在一个数组中的数字组合,并将这些组合存储在另一个数组
- C++以广度优先搜索的方式查找多个数组中元素的所有组合
- 查找大小为 n 的所有可能的数组,这些数组由另一个数组中所有可能的元素组合以所有可能的顺序构建
- 查找所有可能的排列或具有相同顺序的组合
- 查找所有组合,无需重复
- 使用 c++ 查找回车/换行组合
- 查找列表项的组合
- 查找字符串向量的 r 组合
- 如何将查找组合的几个循环代码转换为递归方法
- 查找和存储组合
- 如何查找和替换组合框中的项
- 深度优先搜索或回溯递归查找字谜/拼字板中所有可能的字母组合
- c++使用无序键组合进行映射查找