#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;
--j)
//選u本身也會有價值,加上選u的價值
dp[u]
[j]= dp[u]
[j-1
]+ w[u];}
intmain()
++m;
dfs(0)
; cout << dp[0]
[m]<< endl;
return0;
}
關鍵**#include
#include
#include
using
namespace std;
#define max 400
int dp[max]
[max]
;int n, m;
int v[max]
;vector<
int>son[max]
;void
dfs(
int x)}}
if(x ==0)
return
;//這句**在這裡有關鍵作用,沒有這句**程式將會是錯誤的
for(
int i = m; i >=
1; i--
) dp[x]
[i]= dp[x]
[i -1]
+ v[x];}
intmain()
memset
(dp,
0xcf
,sizeof
(dp));
dfs(0)
;//cout
cout << dp[0]
[m]<< endl;
return0;
}
這句**在這裡有非常重要的作用。如果沒有這一句**,後果就是在整個計算的過程中的,包括了root節點0,但是又因為root節點零的存在,有一節課不能選了:少選了一節課。這也是為什麼上乙個版本的**中mif
(x ==0)
return
;//這句**在這裡有關鍵作用,沒有這句**程式將會是錯誤的
mm增加了一的原因。
(選課)揹包類樹形dp
選課 學校實行學分制。每門的必修課都有固定的學分,同時還必須獲得相應的選修課程學分。學校開設了 n 門的選修課程,每個學生可選課程的數量 m 是給定的。學生選修了這 m 門課並考核通過就能獲得相應的學分。在選修課程中,有些課程可以直接選修,有些課程需要一定的基礎知識,必須在選了其他的一些課程的基礎上...
POJ 1155 TELE (樹形DP,樹形揹包)
題意 給定一棵樹,n個節點,其中有m個葉子表示的是使用者,其他點表示中轉器,每條邊都有權值,每個使用者i願意給的錢w i 問如果在不虧錢的情況下能為多少使用者轉播足球比賽?思路 其實就是要選出部分葉子節點,其花費 所選葉子權值 經過的所有邊權 每條邊只算1次花費 那麼對於每個節點,可以考慮在其子樹下...
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...