P2014 選課(樹形揹包)

2022-04-06 18:09:19 字數 1112 閱讀 2121

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

輸入格式:

第一行有兩個整數n,m用空格隔開。(1<=n<=300,1<=m<=300)

接下來的n行,第i+1行包含兩個整數ki和si, ki表示第i門課的直接先修課,si表示第i門課的學分。若ki=0表示沒有直接先修課(1<=ki<=n, 1<=si<=20)。

輸出格式:

只有一行,選m門課程的最大得分。

輸入樣例#1: 複製

7  4

2 2

0 1

0 4

2 1

7 1

7 6

2 2

輸出樣例#1: 複製

13

1 #include2 #include3

4using

namespace

std;56

const

int maxn = 310;7

8struct

edgee[100100

];11

int head[100100

],tot;

12int

val[maxn],dp[maxn][maxn];

13//

dp[i][j]以i為根的樹中,選了j節課的最大學分。

14 inline int

read()

22 inline void add_edge(int u,int

v) 25

void dfs(int u,int

m) 34}35

intmain()

42 val[0] = 0

;43 dfs(0,m+1

);44 printf("

%d",dp[0][m+1

]);45

return0;

46 }

洛谷 P2014 選課(樹形揹包)

題面 洛谷 p2014 如題這種有依賴性的任務可以用一棵樹表示,因為乙個兒子要訪問到就必須先訪問到父親。然後,本來本題所有樹是森林 沒有共同祖先 但是題中的節點 0 其實就可以當做乙個lca,從節點 0 開始dp。狀態定義 dp x m x節點,選則m課,獲得的最大學分 決策時,模擬揹包,遍歷每乙個...

洛谷P2014 選課 樹形DP 揹包

有nn 門功課,一些功課有先修課。每門功課都有學分。求選出m m門功課能獲得的最大學分。樹形dp 揹包。很明顯,這道題肯定是設f u j f u j 表示以u u為根的子樹選出j j門課程學習能獲得的最大學分。那麼對於u u的任意一棵子樹v v,我們設它有s s個結點,那麼我們就可以在這棵子樹中選擇...

選課 P2014 樹形DP

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