題目鏈結:
題目大意:樹上取點。父親出現了,其兒子包括孫子...都不能出現。給定預算,問最大值。
解題思路:
把樹形揹包的模板改一改。
首先對於葉子結點,直接初始化就行了。這步不可以跳過,因為存在負權,僅僅依靠最後的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次花費 那麼對於每個節點,可以考慮在其子樹下...