題目大意:有n門功課,每門課有個學分,每門課有一門或沒有直接先修課(若課程a是課程b的先修課即只有學完了課程a,才能學習課程b)。乙個學生要從這些課程裡選擇m門課程學習,問他能獲得的最大學分是多少?
對於每個節點u,定義u->dp[j]為在剩餘課程數為j,以u為根的子樹中能夠獲得的最高學分,則u->dp[j]=max|v∈u->son}。
當u的子節點的子節點的dp值通過遞迴得出後,我們可以對u的每個dp[j]做乙個揹包。sum[k]==j-1提醒我們揹包體積為j-1,k為物體的容量。dp求和提示我們dp[k]作為物體的價值。因為湊成j-1時每個v只選出乙個v->dp[k],這提示我們揹包按照子節點進行分組,物體最多選乙個。這便是乙個分組揹包!之後將u->dp[j]=u->dp[j-1]+u->score.
注意:
luogu P2014 選課 樹形揹包
選課啊,好厲害的一道題,記得當年是瑣大神給我講的呢。樹形揹包 廢話 並不想再抄題幹 用dfs式的樹形dp更新,能過的原因是這題資料範圍是在是太小了。只有500 如果說要注意的地方的話,就是dfs裡的迴圈是逆序的,原因同揹包,從子樹j中,不可能重複選。其實dp i k 是省去了一維的即從i的前j棵子樹...
P2014 選課(樹形揹包)
在大學裡每個學生,為了達到一定的學分,必須從很多課程裡選擇一些課程來學習,在課程裡有些課程必須在某些課程之前學習,如高等數學總是在其它課程之前學習。現在有n門功課,每門課有個學分,每門課有一門或沒有直接先修課 若課程a是課程b的先修課即只有學完了課程a,才能學習課程b 乙個學生要從這些課程裡選擇m門...
(選課)揹包類樹形dp
選課 學校實行學分制。每門的必修課都有固定的學分,同時還必須獲得相應的選修課程學分。學校開設了 n 門的選修課程,每個學生可選課程的數量 m 是給定的。學生選修了這 m 門課並考核通過就能獲得相應的學分。在選修課程中,有些課程可以直接選修,有些課程需要一定的基礎知識,必須在選了其他的一些課程的基礎上...