樹形DP高階之揹包問題

2021-07-02 01:21:46 字數 1186 閱讀 9287

hdu1561——the mre,the better

題意:給定一棵包含n個結點的樹,每乙個節點附有對應的value,選取其中的m個結點使得總value最大。乙個結點被選擇的條件是其父節點已經被選擇。

解析:1.虛擬出乙個總根節點,將深林轉化為一棵樹。

2.d[r][i]表示在以r為根的子樹中選取i個結點所能獲得的最大value

d[r][i]=max(d[r][i],d[r][i-k]+d[v][k]);      //v為r的乙個子節點

//date:     2015.04.22

//time: 109ms

//memory: 1792k

#include#include#includeusing namespace std;

const int max=205;

int n,m,v[max];

vectorson[max];

int dp[max][max];

void dfs(int r,int num) }}

void init()

int main()

dfs(0,m+1);

printf("%d\n",dp[0][m+1]);

} return 0;

}

hdu1011——starship troopers

題意:給定乙個包含n個結點的樹,每個節點附有對應的value和bug,為獲取value需消耗一定量的體力來消滅bug,在體力值一定的情況下,選取其中的哪些結點進行攻擊

可以使得獲取的總value達到最大。只有在父節點已經被攻擊後才可以繼續前進攻擊子節點。

//date: 2015.04.25

//time: 62ms

//memory: 1680k

#include #include #include #include #include using namespace std;

const int max=101;

int n,m;

int dp[max][max];

struct roomrooms[max];

void init()

void dfs(int r,int f,int trooper)

}}int main()

for(i=1;i

樹形揹包DP

include using namespace std const int n 310,m n 2 int h n ne m v m idx int w n int dp n n int n,m void add int a,int b void dfs int u for int j m j 0 ...

有依賴的揹包問題(樹形dp 揹包問題)

acwing 10.有 n 個物品和乙個容量是 v 的揹包。物品之間具有依賴關係,且依賴關係組成一棵樹的形狀。如果選擇乙個物品,則必須選擇它的父點。如下圖所示 如果選擇物品5,則必須選擇物品1和2。這是因為2是5的父節點,1是2的父節點。每件物品的編號是 i,體積是 vi,價值是 wi,依賴的父節點...

洛谷2014 選課(樹形DP 樹形揹包問題

在大學裡每個學生,為了達到一定的學分,必須從很多課程裡選擇一些課程來學習,在課程裡有些課程必須在某些課程之前學習,如高等數學總是在其它課程之前學習。現在有n門功課,每門課有個學分,每門課有一門或沒有直接先修課 若課程a是課程b的先修課即只有學完了課程a,才能學習課程b 乙個學生要從這些課程裡選擇m門...