【问题标题】:Find number of combinations of ordered set using multiple summations使用多个求和查找有序集合的组合数
【发布时间】:2012-06-18 05:16:11
【问题描述】:

这是关于查找有序集合的多个组合的问题,其中元素具有约束。

举个例子:

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

有人可以大致介绍一下解决此类问题的过程或伪代码吗?

非常感谢!

【问题讨论】:

  • 家庭作业?你尝试了什么?此外,特定于语言的标签将是高度相关的。
  • 不是作业。我希望有人理解使用多个求和的数学过程,如数学交换链接中所示,而我不理解。我不确定多个求和是否应该是嵌套循环,将值元素加 1。我只是不太了解数学方程,例如 d=max(c+1,20) 作为求和和多重求和的索引。
  • 这个问题也可能更适合 math.stackexchange.com;虽然你可能会在这里得到答案,但在那里问也无妨。你得到的方程不是特别适合计算;直接计算它需要一个一个地计算。
  • 这个问题首先是在数学 stackexchange 上提出的。该链接包含在此处发布的此问题中。答案是一个求和方程,也是一个建议,询问如何在可能的这个网站上对其进行编码。

标签: java c++ sum combinations combinatorics


【解决方案1】:

一堆嵌套的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) &gt;= 1 始终为真,因此我们可以在对b 的赋值中去掉max 调用。同样,(c+1) &gt;= 20 始终为真,因此可以简化对d 的分配。

您还可以看到a + b + c + d 的最大可能值为 540,这为e 提供了最小可能值为 95。这大于e 的规定下限,因此我们只需检查e &gt;= (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

【讨论】:

  • 谢谢!所以这是通过可能性,测试和增加。我明白了,虽然希望不是那样。这可能需要很长时间才能完成每一个。如果有另一种更快的方法来获得相同的结果,那就太好了!
【解决方案2】:

查看数学交换页面上发布的解决方案。每个 sigma 符号都是一个嵌套的 for 循环。最里面的术语xif 的形式给出。因此,您的算法应该是围绕 if 的四个嵌套循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多