洛谷P2014 選課

2021-08-04 12:26:20 字數 1283 閱讀 8856

題目描述

在大學裡每個學生,為了達到一定的學分,必須從很多課程裡選擇一些課程來學習,在課程裡有些課程必須在某些課程之前學習,如高等數學總是在其它課程之前學習。現在有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此題因為求最大的學分,一定使用樹形動態規劃,否則超時!(或者說是樹形依賴揹包)

對於每乙個節點來說,它的存在與否都是關係到他下邊的學分的,題目要求最後是留下幾個課程,那麼如果不要這個點的左子樹的話,他右子樹的就可以留k-1條邊,因為要拋去這個點和右子樹點的邊,那麼現在就有兩個狀態,要左子樹或要右子樹,還有乙個狀態就是兩邊都要,那麼分給左子樹的邊為i,分給右子樹的邊為k-2-i,for i=1 to k-2 do。從這裡找乙個最大值和上兩個狀態比求出最大就是這個點的最優值。

這道題還應該注意建樹,因為右不一定是左的孩子。

狀態轉移方程f[x][j]=max(f[x][j],f[x][j-k]+f[s][k-1]+jz[x][i]);

#includde

#include

#include

#include

#include

#include

#include

using

namespace

std;

vector

jz[200],b[200];

int q,n,f[200][200]={};

int work(int x,int y)

return son;

}int main()

work(0,0);

cout

<0][q]0;}

ps:此題和」二分蘋果樹「基本是乙個題目,只要改改邊界條件即可。

洛谷P2014 選課

又是一道樹型dp,不過這次是以點帶權值,因為根是不確定的,我們可以設個虛根 0 因為算是多了一點,所以總點數應該 因為是點帶權值,所以不用dfs邊的數量了,不過有一點虛注意,因為多了乙個點,所以j層迴圈 所選的邊數 下界應該是到2的。include include using namespace s...

洛谷P2014 選課

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

洛谷P2014 選課

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