樹形揹包DP

2021-10-19 17:56:49 字數 1443 閱讀 5090

#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;

}

關鍵**
if

(x ==0)

return

;//這句**在這裡有關鍵作用,沒有這句**程式將會是錯誤的

這句**在這裡有非常重要的作用。如果沒有這一句**,後果就是在整個計算的過程中的,包括了root節點0,但是又因為root節點零的存在,有一節課不能選了:少選了一節課。這也是為什麼上乙個版本的**中m

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...