選課(樹形DP)

2022-02-27 07:00:07 字數 1222 閱讀 1655

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

這道題是乙個有依賴的揹包問題,我們可以把它變成一棵以0為超級根節點的樹

我們從0開始考慮,定義發dp[n][m]陣列,表示在n處,選m門課能得到的最大學分

我們可以每次分別考慮它的幾個子樹

如果該點就是葉子節點,那麼直接更新

否則,我們寫兩重迴圈來分配科目數

我們知道,要想選到它的子樹,就一定要要選到他自己

所以迴圈從這裡開始

(其實我的**並不是這道題的,誤打誤撞過了,請把大小(.dx)一律看成1)

更新所有值,跑一邊揹包

然後就是根節點的滿揹包就是答案(dp[0][m])

#include#include

#include

#define rii register int i

#define rij register int j

#define rik register int k

using

namespace

std;

struct

wpx[

305];

int n,m,dp[305][305

];void dplast(int

wz)

return

; }

dp[wz][x[wz].dx]=x[wz].val;

for(rii=1;i<=x[wz].sl;i++)}}

}int

main()

dplast(0);

cout

<0

][m];

return0;

}

樹形dp 選課

題目描述 description 學校實行學分制。每門的必修課都有固定的學分,同時還必須獲得相應的選修課程學分。學校開設了n n 300 門的選修課程,每個學生可選課程的數量m是給定的。學生選修了這m門課並考核通過就能獲得相應的學分。在選修課程中,有些課程可以直接選修,有些課程需要一定的基礎知識,必...

codevs1378 選課 樹形DP

學校實行學分制。每門的必修課都有固定的學分,同時還必須獲得相應的選修課程學分。學校開設了n n 300 門的選修課程,每個學生可選課程的數量m是給定的。學生選修了這m門課並考核通過就能獲得相應的學分。在選修課程中,有些課程可以直接選修,有些課程需要一定的基礎知識,必須在選了其它的一些課程的基礎上才能...

code vs 1378 選課(樹形DP)

時間限制 1 s 空間限制 128000 kb 題目等級 鑽石 diamond 題解 檢視執行結果 學校實行學分制。每門的必修課都有固定的學分,同時還必須獲得相應的選修課程學分。學校開設了n n 300 門的選修課程,每個學生可選課程的數量m是給定的。學生選修了這m門課並考核通過就能獲得相應的學分。...