HDU 攻城堡 (依賴揹包 樹形dp)

2021-07-10 04:39:34 字數 880 閱讀 9304

acboy很喜歡玩一種戰略遊戲,在乙個地圖上,有n座城堡,每座城堡都有一定的寶物,在每次遊戲中acboy允許攻克m個城堡並獲得裡面的寶物。但由於地理位置原因,有些城堡不能直接攻克,要攻克這些城堡必須先攻克其他某乙個特定的城堡。你能幫acboy算出要獲得盡量多的寶物應該攻克哪m個城堡嗎?

每個測試例項首先包括2個整數,n,m.(1 <= m <= n <= 200);在接下來的n行裡,每行包括2個整數,a,b. 在第 i 行,a 代表要攻克第 i 個城堡必須先攻克第 a 個城堡,如果 a = 0 則代表可以直接攻克第 i 個城堡。b 代表第 i 個城堡的寶物數量, b >= 0。當n = 0, m = 0輸入結束。

對於每個測試例項,輸出乙個整數,代表acboy攻克m個城堡所獲得的最多寶物的數量。

3 2

0 10 2

0 37 4

2 20 1

0 42 1

7 17 6

2 20 0

5

13

8600

hdu 2006-12 programming contest

#include#include#include#include#include#includeusing namespace std;

vectorvv[222];

int num[222],dp[222][222];

void dfs(int root,int m)

{ int i,j,len=vv[root].size();

dp[root][1]=num[root];

for(i=0;i1) dfs(vv[root][i],m-1);

for(j=m;j>0;j--) {

for(int k=1;k

樹形依賴揹包

問題大意 給出一棵樹,根節點為1,每個點有毒素和收穫。要求毒素不超過給定值的情況下使收穫最大。乙個點的父親節點被選取後這個點才能被選取。首先弄出dfs序,也記錄下每個點其子樹及自身的大小。每個點都能夠被選或不選,如果選了才會考慮它子樹。設f i j 表示dfs序上第i位上的點在其子樹及自身上選取了毒...

hdu1011(揹包樹形DP)

沒有完全理解這題,m個人,攻打乙個map,map的入口是1,在攻打某個結點之前要先攻打其他乙個結點 dp i j 表示m個人攻打以第i個結點為根節點的子樹得到的最優解 狀態轉移dp i j max dp i j dp i k dp t j k 其中t是i結點的子節點 如下 include inclu...

HDU 1561 樹形dp 揹包

分析 攻下一座城堡的前提是要先攻下它的前驅城堡,建立乙個以0為根結點的樹,他的權值為0 dp i,j 表示以i為根結點去j個的最大值。dp i,1 v i v i 為攻下i城堡獲得的寶藏 對與u結點取j 1個,可以轉化為以孩子i為根取k個 以自己為根取j 1 k個和自己取j 1個的最大值 為什麼是j...