XCOJ 1102 樹形DP 揹包

2021-09-08 10:29:25 字數 1177 閱讀 2922

題目鏈結

題目大意:樹上取點。父親出現了,其兒子包括孫子...都不能出現。給定預算,問最大值。

解題思路

把樹形揹包的模板改一改。

首先對於葉子結點,直接初始化就行了。這步不可以跳過,因為存在負權,僅僅依靠最後的max是不行的。

對於普通結點,首先不考慮當前根,先把全部預算分給兒子。

即for(int j=w; j>=1; j--)

for(int k=1; k<=j; k++)

最後再做一次dp[root][cost~m]=max(dp[root][cost~m],w[root])

意思為要麼取所有兒子,要麼只取根。

#include "

cstdio

"#include

"iostream

"#include

"cstring

"using

namespace

std;

#define maxn 1200

intc[maxn],w[maxn],dp[maxn][maxn],head[maxn],tol;

intn,w,u;

struct

edge

e[maxn];

void addedge(int u,int

v)void dfs(int

root)

for(int i=cost;i<=w;i++) dp[root][i]=max(dp[root][i],w[root]);

}int

main()

for(int i=1;i<=n;i++) scanf("

%d",&c[i]);

for(int i=1;i<=n;i++) scanf("

%d",&w[i]);

dfs(1);

printf(

"%d\n

",dp[1

][w]);

}

2600

2013217098

1102

accepted

7176

56

c++/edit

1188 b

2014-10-20 20:18:43

樹形揹包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

選課 學校實行學分制。每門的必修課都有固定的學分,同時還必須獲得相應的選修課程學分。學校開設了 n 門的選修課程,每個學生可選課程的數量 m 是給定的。學生選修了這 m 門課並考核通過就能獲得相應的學分。在選修課程中,有些課程可以直接選修,有些課程需要一定的基礎知識,必須在選了其他的一些課程的基礎上...

POJ 1155 TELE (樹形DP,樹形揹包)

題意 給定一棵樹,n個節點,其中有m個葉子表示的是使用者,其他點表示中轉器,每條邊都有權值,每個使用者i願意給的錢w i 問如果在不虧錢的情況下能為多少使用者轉播足球比賽?思路 其實就是要選出部分葉子節點,其花費 所選葉子權值 經過的所有邊權 每條邊只算1次花費 那麼對於每個節點,可以考慮在其子樹下...