選課 CH5402(揹包類樹形DP

2021-10-07 07:31:21 字數 2015 閱讀 3874

題目:

學校實行學分制。每門的必修課都有固定的學分,同時還必須獲得相應的選修課程學分。學校開設了n(n<300)門的選修課程,每個學生可選課程的數量m是給定的。學生選修了這m門課並考核通過就能獲得相應的學分。

在選修課程中,有些課程可以直接選修,有些課程需要一定的基礎知識,必須在選了其它的一些課程的基礎上才能選修。例如《frontpage》必須在選修了《windows操作基礎》之後才能選修。我們稱《windows操作基礎》是《frontpage》的先修課。每門課的直接先修課最多只有一門。兩門課也可能存在相同的先修課。每門課都有乙個課號,依次為1,2,3,…。

表中1是2的先修課,2是3、4的先修課。如果要選3,那麼1和2都一定已被選修過。   

你的任務是為自己確定乙個選課方案,使得你能得到的學分最多,並且必須滿足先修課優先的原則。假定課程之間不存在時間上的衝突。

輸入格式:

輸入檔案的第一行包括兩個整數n、m(中間用乙個空格隔開)其中1≤n≤300,1≤m≤n。

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

輸出格式:

輸出檔案只有乙個數,實際所選課程的學分總數。

輸入樣例:

7 42 2

0 10 4

2 17 1

7 62 2

輸入樣例:

13演算法思想:

因為每門課的先修課最多只有一門(對應著樹中每個節點至多只有1個父親),所以這n門課程構成了森林結構(若干棵樹,因為可能有不止一門課沒有先修課)。簡便起見,我們可以新建乙個「虛擬課程」——0號節點,作為「實際上沒有先修課的課程」的先修課,把包含n個節點的森林轉化為包含n+1個節點的樹,其中節點0為根節點。

設f[x,t]表示在以x為根的子樹中選t門課能夠獲得的最高學分,設x的子節點集合為son(x) , 子節點個數p=|son(x)| 。修完x這門課後, 對於x的每個子節點y∈eson(x) , 我們可以在以yi為根的子樹中選修若干門課(記為ci),在滿足∑ci=t-1的基礎上獲得盡量多的學分。

當t=0時,顯然f[x,0]=0,當t>0時,根據以上分析,狀態轉移方程如下:

該方程其實是乙個分組揹包模型。有p=|son(x) |組物品, 每組物品都有t-1個,其中第i組的第j個物品的體積為j,價值為f[yi , j],揹包的總容積為t-1。我們要從每組中選出不超過1個物品(每個子節點y只能選乙個狀態轉移到x),使得物品體積不超過t-1的前提下(在修完x後,還能選修t-1門課),物品價值總和最大(獲得最多學分)。當然,x=0是乙個特例,因為虛擬的根節點實際上不需要被選修,此時揹包總容積應為t。我們用分組揹包進行樹形dp的狀態轉移。

**如下:

#include

#include

#include

#include

#include

using

namespace std;

vector<

int> son[

310]

;int f[

310]

[310

], s[

310]

, n, m;

voiddp(

int x)

if(x !=0)

// x不為0時,選修x本身需要占用1門課,並獲得相應學分

for(

int t = m; t >

0; t--

) f[x]

[t]= f[x]

[t-1

]+ s[x];}

intmain()

memset

(f,0xcf

,sizeof

(f))

;// -infdp(

0); cout << f[0]

[m]<< endl;

}

CH5402 選課 樹形DP 揹包

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

(選課)揹包類樹形dp

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

acwing 286 選課(揹包類樹形dp)

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