洛谷P2014 選課 樹形dp

2022-04-06 03:26:04 字數 1194 閱讀 4063

在大學裡每個學生,為了達到一定的學分,必須從很多課程裡選擇一些課程來學習,在課程裡有些課程必須在某些課程之前學習,如高等數學總是在其它課程之前學習。現在有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

/*

樹形dp:f[i][j]表示以i為根節點的子樹不包括i選了j門課的最大收益

轉移的時候列舉i的子節點擊多少門課

f[i][j]=max(f[i][j],f[i][j-k]+f[to][k]);

*/#include

#include

#include

#define n 307

#define m 2007

using

namespace

std;

intf[n][n],size,cnt,n,m;

inthead[m];

struct

edge

e[m<<1

];inline

intinit()

while(c>='

0'&&c<='9')

return x*f;

}inline

void add(int u,int

to)void dp(intx)

}int

main()

dp(0);

printf("%d

",f[0][m+1

]);

return0;

}

洛谷P2014 選課 樹形dp

給出n 300 n leq300 n 30 0個結點,每個結點都有乙個權值,然後一些結點必須只有選了前驅結點這個結點才可以被選。現在最多選m 300 m leq300 m 30 0個結點,求最大權值。實際上這個是乙個森林,但是通過設定乙個權值為0 00的虛點0 00,把所有的沒有前驅的點全部連到這個...

洛谷P2014 選課(樹形DP)

傳送門 難度提高 省選 該題是一道經典的樹形dp題目,基本就是樹形dp的板子題。注意點的解釋參考 為什麼最後兩行要單獨拿出來做呢?for int i s x i 0 i f x i 1 f x i p x 我們回到題面上,父親是兒子的先修課,所以沒有父親時,兒子再多也沒有用,揹包中處理的子樹是不帶根...

樹形DP 洛谷P2014 選課

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