oiclass1454 選課 樹上揹包

2022-09-11 12:09:25 字數 920 閱讀 1143

題目

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