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