CH5402 選課 樹形DP 揹包

2022-06-26 03:57:10 字數 1719 閱讀 1443

描述

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

在選修課程中,有些課程可以直接選修,有些課程需要一定的基礎知識,必須在選了其他的一些課程的基礎上才能選修。例如《windows程式設計》必須在選修了《windows操作基礎》之後才能選修。我們稱《windows操作基礎》是《windows程式設計》的先修課。每門課的直接先修課最多只有一門。兩門課可能存在相同的先修課。

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

輸入格式

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

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

輸出格式

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

樣例輸入

7 4

2 20 1

0 42 1

7 17 6

2 2

樣例輸出
13
題意:

從n門課中選出m門課,使得他們的學分和最大。有的課程有先修課。

思路:n門課構成了乙個森林,給他們新增乙個編號為0的虛擬節點,表示沒有先修課的課程的先修課。

dp[x][t]表示在以x為根的樹中選出t門能獲得的最高學分。他是由他的子樹的最大值加上自己的學分得來。

實際上是乙個分組揹包模型。有p|son(x)|組物品,每組物品有t-1個,其中第i組的第j個物品的體積為j,價值為dp[yi,j],揹包的總容積為t-1。(yi是x的兒子)我們要從每組中選出不超過1個物品,使得物品體積不超過t-1的前提下,物品價值總和最大。x=0是乙個特例。

揹包類樹形dp,又稱有樹形依賴的揹包問題。除了以「節點編號」作為樹形dp的幾階段,通常我們也像線性dp一樣,把當前揹包的「體積」作為第二維狀態。

1

//#include

2 #include3 #include4 #include5 #include6 #include7 #include8 #include9

10#define inf 0x3f3f3f3f

11using

namespace

std;

12 typedef long

long

ll;13

14int

n, m;

15const

int maxn = 305

;16 vectorson[maxn];

17int

sco[maxn];

18int

dp[maxn][maxn];

1920

void dfs(int

x)2131}

32}33if(x != 0)37

}38}39

40int

main()

4148

49 dfs(0

);50 printf("

%d\n

", dp[0

][m]);

51return0;

52 }

選課 CH5402(揹包類樹形DP

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

(選課)揹包類樹形dp

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

洛谷2014 選課(樹形DP 樹形揹包問題

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