因为我是初学者,所以我对DP有问题。 这是我的问题,就像乌龟塔一样,但是有所变化,因为它也具有每只乌龟的值。
您将得到n只乌龟,并且每只乌龟都会得到其重量[w] 它的强度(s)和价值(v)。乌龟的力量是 您可以在不破裂外壳的情况下最大重量地放置它。找出 通过堆叠一只,您可以从海龟身上获得最大的价值 没有龟裂的顶端。
我在递归关系方面遇到麻烦,因为我对必须检查每只海龟顶部的重量之和是否高于其强度感到困惑。 我的意思是,我考虑过要为每个添加到塔中的每只海龟制作一个拥有最佳塔值的数组,但是我不知道如何检查新龟下的所有海龟是否都可以容纳新的总和重量与强度。
我能想到的唯一方法是将每只乌龟的力量减去在她身上的海龟的current_sum_of_weights重量。但这似乎太复杂了。
我想我首先要根据每个人的体重和力量的总和对海龟进行排序,但是递归仍然很麻烦。
我不需要编写代码,我只想编写递归关系并证明它。
答案 0 :(得分:1)
让f(i, v)
代表最轻值v
的塔的权重,直到第i
座塔,{{ 1}}上升。然后:
weight + strength
我们想证明我们可以通过f(i, v) = min(
f(i - 1, v),
weight(i) + f(i - 1, v - value(i))
if strength(i) ≥ f(i - 1, v - value(i)) else Infinity
)
升序来重新排列要订购的任何合法塔楼。为此,我们需要显示任何连续对,其中
weight + strength
可以合法地交换,因为这样我们就可以进行冒泡排序了。换句话说,那
(1) strength(t_i+1) + weight(t_i+1) < strength(t_i) + weight(t_i)
原始的合法塔楼有
(2) (Sum j=1...i−1 of weight(t_j)) + weight(t_i+1) < strength(t_i)
在两面都添加(3) (Sum j=1...i−1 of weight(t_j)) + weight(t_i) ≤ strength(t_i+1)
weight(t_i+1)
用(1)代替右侧
(4) (Sum j=1...i−1 of weight(t_j)) + weight(t_i) + weight(t_i+1) ≤ strength(t_i+1) + weight(t_i+1)
取消(Sum j=1...i−1 of weight(t_j)) + weight(t_i) + weight(t_i+1) ≤ strength(t_i) + weight(t_i)
:
weight(t_i)
答案 1 :(得分:0)
您需要优化价值,并且正确地指出按强度对海龟进行分类会有所帮助。我们可以从按重量或按值排序开始,但作为第一步的按强度排序则更有意义,因为这样您将看到可能的而不是期望的。但是,重量也是可能性的一部分,因此s * w作为排序标准就更有意义了,因为您要将最大的(重的和坚固的)海龟放到塔架的底部,将最弱的海龟放到塔的顶部。
由于您必须找出最佳解决方案,因此有必要针对此任务使用除法和因佩拉实现来计算所有看似可行的解决方案,并避免必须评估可证明的更差的替代方案,因此应在可行的情况下始终修剪候选变异,这是有意义的比目前的解决方案更糟糕。
如果w1 <= w2且s1 <= s2且v1 因此,当您找到第一个可以使用的乌龟时,便会搜索具有更多强度,重量或价值的替代品。由于建议的排序方式,较高的索引值很少会具有较高的重量或强度,但这仍然是可能的。