繁体   English   中英

动态编程最佳解决方案

[英]Dynamic Programming Optimal Solution

公司正在为其员工计划聚会。 有趣的等级被分配给每个雇员。 员工被组织成严格的等级制度,即植根于总裁的树。 但是,聚会的来宾名单上有一个限制:雇员及其直属上司(树中的父母)不能同时参加聚会。 您希望为聚会准备宾客名单,以最大程度地提高宾客的娱乐评分总和。 证明根据趣味等级贪婪地选择客人不会起作用。 然后,制定一个动态编程解决方案

我无法理解某些条件,例如总统的娱乐率是否高于其后代的娱乐率,以及每个主管的雇员人数。 有人可以帮助我进行此操作吗?

从问题的措辞来看,在层次结构树中分配给某人的娱乐等级不一定高于其在层次结构树中的后代。

但是,即使是这种情况,要发现挑选最佳员工也不是最佳选择,请考虑树高2的树,其根为fun = 10,并且有20个子代fun = 1。 那么最佳的解决方案是跳过贪婪的选择(根)并选择20个孩子。

在任何情况下,即使父母的后代乐趣比后代低,使用动态编程也可以找到最佳的解决方案。 对于树中的节点v,令F(v)为以v为根的子树可以获得的最大乐趣。然后选择v,在这种情况下,子级将被跳过,然后查看以子为根的所有子树的子项(将这些子树上的最大乐趣的总和添加到fun(v)中),或者跳过v然后获得最大乐趣,这是根于v的孩子的所有子树上的最大乐趣的总和。线性时间动态规划算法。

对于贪婪的例子,请举一个简单的反例。

    1
    |
 1--3--1
    |
    1

贪婪地选择,即首先选择3不允许我们选择任何其他雇员。 但是,如果我们不选择3,则max将为4(全为1)。 因此,贪婪的方法行不通。

对于动态编程,我们可以将问题表达为选择子树的给定根。 如果我们选择一个节点,则不能选择其子节点。 但是,如果不选择节点,则可以选择子节点,也可以不选择子节点。

for all v initialize
  c(v,true) = fun(v)
  c(v,false)= 0

比用下面的递归来解决问题

weight(v,true)  = for all children sum( weight(ci,false) ) + fun(i)
weight(v,false) = for all children sum( max(weight(ci,false), weight(ci,true)))

对于根节点max(weight(v,true),weight(v,false))答案将为max(weight(v,true),weight(v,false))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM