洛谷P2014 選課

2022-08-18 22:18:11 字數 1205 閱讀 2163

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

輸入格式:

第一行有兩個整數n,m用空格隔開。(1<=n<=300,1<=m<=300)

接下來的n行,第i+1行包含兩個整數ki和si, ki表示第i門課的直接先修課,si表示第i門課的學分。若ki=0表示沒有直接先修課(1<=ki<=n, 1<=si<=20)。

輸出格式:

只有一行,選m門課程的最大得分。

輸入樣例#1: 複製

7  4

2 2

0 1

0 4

2 1

7 1

7 6

2 2

輸出樣例#1: 複製

13

/*

這種題我真的不太會辣 還要感謝孤獨粲澤dalao給的思路

因為這個圖還不是樹 所以我們假設乙個「0」節點(不存在的)鏈結所有沒有先修課的課程

就可以樹形dp了 叕是一道和二叉蘋果樹差不多的題。其實是用上了揹包+樹形dp的思想。

狀態轉移:f[u][j] = max(f[u][j],f[u][j-k]+f[v][k])

u表示當前節點 j表示除u外選的課數 f[u][j]表示最大收益

另外在k <= j-1時列舉k 表示子樹v選的課程數

*/#include

using

namespace

std;

const

int maxn = 305

;int

f[maxn][maxn],n,m,head[maxn],cnt;

struct

nodeg[maxn];

void addedge(int

from,int

to)void dfs(int

u) }

}int

main()

dfs(

0);//

對「0」節點dfs

printf("

%d",f[0][m+1

]);

return0;

}

洛谷P2014 選課

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

洛谷P2014 選課

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

洛谷P2014 選課

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