[英]Greedy algorithm or dynamic programming?
给出了列表 l = [x_1, ..., x_n] 。 列表中的每个元素都是某块木头的长度。 要粘合两块长度为 a 和 b 的木头,您需要 max(a,b) 的胶水。 粘合后,你得到一块长度为 a+b 的木头。 计算粘合所有部件的最小胶水量。
你认为贪心算法在这里有效吗? 我想不出任何例子。 说贪心算法我的意思是:取两块最小长度,将它们粘合起来,直到所有块都粘合为止。 使用一些优先级队列,这可以在 O(n log n) 复杂度中完成。
那样有用吗? 如果没有,请给我一些列表 l 的例子,它可以用比贪婪算法所说的更少的胶水粘合。
贪心算法并不总是最优的。 一个反例是 [1, 2, 2, 3],贪婪算法将使用 10 个单位的胶水,而最优算法将使用 9 个单位。
贪心算法:
1-2 = 2 glue
2-3 = 3 glue
3-5 = 5 glue
---------------
total = 10 glue
最佳的:
2-2 = 2 glue
1-3 = 3 glue
4-4 = 4 glue
--------------
total = 9 glue
是动态规划。
看起来没有最优贪心算法,也没有通用的动态规划解决方案。 我认为这是NP-hard ,我解释了原因。
让我们分析问题。 我们有 N 个元素。 让我们将这个集合分成两个具有 X 和 Y 元素的子集。 首先我们粘合 X 子集中的所有元素,然后以某种方式粘合 Y 子集中的所有元素(如分而治之技术)。 在最后的粘合中,我们应该粘合代表 X 和 Y 子集的 2 个元素。 在最后一次粘合中我们需要的最少胶量是多少? X元素和Y元素之和差最小的时候! 我们将这个问题表示为递归划分问题,它本身就是 NP 难问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.