題目
在大學裡每個學生,為了達到一定的學分,必須從很多課程裡選擇一些課程來學習,在課程裡有些課程必須在某些課程之前學習,如高等數學總是在其它課程之前學習。現在有 \(n\) 門功課,每門課有個學分,每門課有一門或沒有直接先修課(若課程 \(a\) 是課程 \(b\) 的先修課即只有學完了課程 \(a\),才能學習課程 \(b\))。乙個學生要從這些課程裡選擇 \(m\) 門課程學習,問他能獲得的最大學分是多少?
輸入第一行有兩個整數 \(n,m\) 用空格隔開。(\(1\leq n \leq 300,1\leq m\leq 200\))
接下來的 \(n\) 行,第 \(i+1\) 行包含兩個整數 \(k_i\) 和 \(s_i\), \(k_i\) 表示第 \(i\) 門課的直接先修課,\(s_i\) 表示第 \(i\) 門課的學分。若 \(k_i=0\) 表示沒有直接先修課(\(1\leq k_i \leq n, 1\leq s_i \leq 20\))。
輸出只有一行,選 \(m\) 門課程的最大得分。
輸入樣例
7 42 2
0 10 4
2 17 1
7 62 2
輸出樣例
題解經典題,傳統解法是將講多叉樹轉化成二叉樹,然後在二叉樹上進行樹形dp,現在使用樹上揹包來解會更簡單。
需要事先學習樹上揹包,理解分組揹包的求法,理解如何將問題轉化成樹上揹包問題。
本題有兩種定義方式。
1定義\(f[i][j]\)表示以i為根選擇j門課程的最大得分(包含i的結點),**如下:
#includeusing namespace std;
const int n=300+5;
vectorg[n];
int n,m,u,v,w,f[n][n],s[n];
void dfs(int u)
dfs(0);
cout<
oiclass4094 騎士 基環樹
問題描述 z 國的騎士團是乙個很有勢力的組織,幫會中匯聚了來自各地的精英。他們劫富濟貧,懲惡揚善,受到社會各界的讚揚。最近發生了一件可怕的事情,的 y 國發動了一場針對 z 國的侵略戰爭。戰火綿延五百里,在和平環境中安逸了數百年的 z 國又怎能抵擋的住 y 國的軍隊。於是人們把所有的希望都寄託在了騎...
14 5繼承與組合
程式的版權和版本宣告部分 檔名稱 a.cpp 作 者 孔雲 完成日期 2014年5月29日 版 本 號 v1.0 輸入描述 num,name,year,month,day 和修改後的year,month,day 問題描述 1 birthdate 生日類 含有 year,month,day 等資料成員...
1 4 5 收集trace日誌
trace日誌有助於發現故障的詳細資訊,確認問題原因 影響範圍 故障現象。前提條件 alert日誌提及到的一些trace日誌和incident trace檔案,要一併收集。操作步驟 步驟 1 以oracle使用者登入。步驟 2 根據alert日誌中提示所涉及的trace日誌檔案,收集trace日誌。...