簡體   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