我有以下问题:
给定一组变量之和,如{a + b,b + c,c + d,a + a + d,b},找到变量的正整数值,使得所有和都是不同的并且是最高和尽可能小。
是否有算法可以找到或近似解决这类问题?
答案 0 :(得分:1)
我创建了一个可能的solution and an implementation in C#。希望这是你需要的。如果有人证明它是正确/不正确但它的工作原理和结果看起来是正确的,这将是很好的。理论细节如下。它的复杂性大约是O(N!*M^3*Log2(N))
,其中N
是变量的数量,M
是所有求和的总和数。
BTW,对于你的例子,它给出了这个结果:
c=3, a=2, d=2, b=1
{a+b=3; b+c=4; c+d=5; a+a+d=6; b=1}
max=6
<强>更新强>
算法理论。
假设变量是有序的,例如a >= b >= c >= ....
假设一组总和是 Bag ,如果其中的所有总和都是不同的。
Bag中的所有总和可以分为两组:不包含变量a
的总和和包含变量的总和。让我们将第一组称为 Head ,将第二组称为 Tail 。
请注意,两者都是包,因为它们包含不同的总和。
我们可以从Tail中的每个总和中减去a
,以便所有总和保持不同(即Tail仍然是一个Bag)。这样我们就得到两个包都没有变量a
。
类似地,我们从两个包中排除变量b
并获得四个包。
我们对每个变量重复此操作,直到我们得到最后一个变量的总和(假设它是d
)。 d
的最小值为1。
之后我们可以返回上一步,并在尾部的总和中包含变量c
。请记住,我们有许多对头尾,需要加入它们。为此,我们将c
添加到每个尾部的每个总和中,以便尾部的总和必须与头部不同。
如何计算c
?我们的想法是计算其无效值,然后获取非无效的最小值,并且等于或大于d
。使用条件HeadSum != TailSum + c
=&gt;计算无效值是微不足道的。 c != HeadSum - TailSum
。对于尾总和和总和的每个组合,我们得到所有无效的值。
折叠所有对头尾并计算每个变量,我们得到案例a >= b >= c >= d
的解决方案。
然后我们为a >= b >= c >= d
的每个排列计算一个解,并找到最小的一个。
PS如果有人提供更好的解决方案会很棒,因为我认为我的算法在某种程度上是近似的(但是很好的近似),甚至可以更好地证明它。
最糟糕的是N!
复杂因为排列,我仍然不知道如何摆脱它。