这是关于找到有序集的多个组合的问题,其中元素具有约束。
举个例子:
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
有人可以大致了解解决此类问题的程序或伪代码吗?
非常感谢!
答案 0 :(得分:0)
查看数学交换页面上发布的解决方案。每个sigma符号都是嵌套的for
循环。最里面的术语x
以if
的形式给出。因此,您的算法应该是围绕if。
答案 1 :(得分:0)
一堆嵌套的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
始终为真,因此我们可以在max
的作业中删除b
来电。同样,(c+1) >= 20
始终为true,因此可以简化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