P2014 CTSC1997 選課(樹形dp)

2021-10-09 04:26:59 字數 1595 閱讀 5324

題目傳送門

description

大學裡實行學分。每門課程都有一定的學分,學生只要選修了這門課並考核通過就能獲得相應的學分。學生最後的學分是他選修的各門課的學分的總和。

每個學生都要選擇規定數量的課程。其中有些課程可以直接選修,有些課程需要一定的基礎知識,必須在選了其它的一些課程的基礎上才能選修。例如,《資料結構》必須在選修了《高階語言程式設計》之後才能選修。我們稱《高階語言程式設計》是《資料結構》的先修課。每門課的直接先修課最多只有一門。兩門課也可能存在相同的先修課。為便於表述每門課都有乙個課號,課號依次為1,2,3,……。下面舉例說明

上例中1是2的先修課,即如果要選修2,則1必定已被選過。同樣,如果要選修3,那麼1和2都一定已被選修過。

學生不可能學完大學所開設的所有課程,因此必須在入學時選定自己要學的課程。每個學生可選課程的總數是給定的。現在請你找出一種選課方案,使得你能得到學分最多,並且必須滿足先修課優先的原則。假定課程之間不存在時間上的衝突。

input

輸入檔案的第一行包括兩個正整數m、n(中間用乙個空格隔開)其中m表示待選課程總數(1≤m≤1000),n表示學生可以選的課程總數(1≤n≤m)。

以下m行每行代表一門課,課號依次為1,2……m。每行有兩個數(用乙個空格隔開),第乙個數為這門課的先修課的課號(若不存在先修課則該項為0),第二個數為這門課的學分。學分是不超過10的正整數。

output

輸出檔案第一行只有乙個數,即實際所選課程的學分總數。以下n行每行有乙個數,表示學生所選課程的課號。

sample input

7 42 20 1

0 42 1

7 17 6

2 2sample output

這題和p2015 二叉蘋果樹(樹形dp) 差不多

這題不是一棵2叉樹,而是一棵多叉樹

具體方法就是把第乙個兒子放在父節點的左子樹,其他兒子放在其兒子的右子樹上。 定義 f[x,y] 表示根節點x,選y門課,可以得到的最優值。 轉移方程有

f[x,y]

=max

0<=k<=y

#include

#include

using

namespace std;

int n,m,b[

305]

,a[305][

305]

,f[305][

305]

,tree[

305]

[305];

voiddp(

int x)

//dp

}int

main()

dp(0)

;//dp

printf

("%d"

,f[0

][m]);

//輸出

}

洛谷P2014 選課

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

洛谷P2014 選課

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

選課 P2014 樹形DP

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