在大學裡每個學生,為了達到一定的學分,必須從很多課程裡選擇一些課程來學習,在課程裡有些課程必須在某些課程之前學習,如高等數學總是在其它課程之前學習。現在有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 42 2
0 1
0 4
2 1
7 1
7 6
2 2
輸出樣例#1: 複製
13
1 #include2 #include34using
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門...