【发布时间】:2016-04-17 17:42:29
【问题描述】:
给出了列表 l = [x_1, ..., x_n]。列表中的每个元素都是某块木头的长度。要粘合两块长度为 a 和 b 的木头,您需要 max(a,b) 胶水。粘合后,你得到一块长度为 a+b 的木头。计算粘合所有部件的最少胶水量。
你认为贪心算法在这里有效吗?我想不出任何例子。说贪心算法,我的意思是:取两块最小长度的部分,粘上它们,然后这样做,直到所有部分都粘好。使用一些优先级队列,这可以在 O(n log n) 复杂度内完成。
这行得通吗?如果没有,请给我一些列表 l 的例子,它可以用比贪心算法说的更少的胶水粘合。
【问题讨论】:
-
粘两片会增加长度吗?
-
什么意思?当你粘合两段长度 a 和 b 时,你会得到长度为 a + 长度 b 的新段。
-
两根棍子可以粘在一起,这就是我问的原因。在这种情况下,恕我直言,实际上胶水量取决于长度,这很奇怪。
-
您确定有解决此问题的有效方法吗?我猜它是NP难的。例如,如果您稍微改变问题,使除了最后一次粘合之外的所有胶水都没有,那么问题是找到尽可能接近 sum(x_i)/2 的长度子集,这就是分区问题.这并不意味着这个问题也是 NP 难的,但它具有暗示性。
-
这听起来像是用最小数量的硬币进行更改的问题。对于某些硬币面额的集合,可以用贪心算法解决,但对于其他面额则不行。我最近了解到,有一篇论文描述了一种算法,用于在有限时间内确定贪心算法是否足以满足一组给定的硬币面额。
标签: algorithm dynamic-programming greedy