嵌套算法

时间:2012-05-30 06:55:39

标签: algorithm nested

我有一个嵌套长度的问题,请告诉我解决这个问题的最佳方法。我的问题如下。

我有一些标准长度,可以说总长度(这是我们需要用一些特定长度的块填充的总长度)

输入是长度块列表,例如:5000,4000,3000

每个块之间的间隙是一个范围,例如:200到500(这个间隙可以在范围内调整)

现在我们必须用上面可用的长度块填充总长度,每个块之间有间隙,并且间隙应该在上面给出的间隙范围内。

请建议我解决这个问题的方法。

提前感谢...

此致 阿尼尔

1 个答案:

答案 0 :(得分:0)

此问题基本上是Subset sum problem,但有一点点扭曲。您可以使用相同的伪多项式时间解作为子集求和:创建一个长度为“总长度”的数组(从现在开始我们称之为 n ),对于每个长度 k ,将其添加到数组中的每个现有长度(因此,如果填充元素 m ,则在 m + k 处创建一个新条目(如果 m + k ≤n),但也将现有的一个保留在 m ,以及在 k 位置创建一个新的数组条目,表示新的创建组。您可以在数组元素 i 中构建一组条目,以表示总计 i 的长度块列表集。每个集合条目应该链接回它来自的数组条目,它可以通过简单地存储到达那里的最后长度来完成。这类似于我最近回答的问题here,您可以根据需要进行调整以允许重复。

但是,您需要修改上述方法以解决差距。我们称每个元素 x 与最大间隙 y 之间的最小间隙。添加长度为 k 的条目时,只要将其添加到另一个条目,我们就会包含最小间隙(因此,如果填充 m ,我们实际上会在 m处创建条目+ k + x )。我们继续在 k 创建初始条目,因为我们包含了元素之间的差距。当我们创建一个条目时,我们也可以确定它是否填充了空间。假设新条目包含 t 元素并且总计 m 。然后它填充空间iff m≥n - t y - x )。如果填充空间,我们应该将其添加到解决方案列表中。根据您需要的解决方案数量,您可以在找到足够的解决方案后立即终止算法,或者让它找到所有解决方案。最后,只需遍历解决方案列表即可。

范围内的任何东西都可以通过多种不同的方式表示它的差距,但一种方法是贪婪地分配“松弛” - 例如,如果你使用上面的距离新总长度1000例如,你可以选择前三个间隙为500(每个300额外松弛,总额为900),然后第四个为300(额外100个松弛,总计1000)并且每个额外间隙应该最小( 200)。