選課 0x50 動態規劃 例題

2021-09-12 14:39:12 字數 1058 閱讀 1332

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

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

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

輸入檔案的第一行包括兩個整數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

本題是揹包類樹形dp,我們設f[ x , t ] 為選修以課程 x 為根的 t 門課所能獲得的最大學分。通常我們使用分組揹包模型來解決有樹形依賴的揹包問題。

#include#include#includeusing namespace std;

int n,m;

const int maxn = 400;

int val[maxn]; //存放每門課學分

vectorson[maxn];

int f[maxn][maxn];//f(x,t)為從以x為根的子樹中選t門課最大學分

void read(); //讀入資料

void solve(); //求解

int main()

void read()

}void dfs(int u)

} }if(u) }}

void solve()

0x50 動態規劃 傳紙條 線性DP

給定乙個 n m n mn m 的矩陣 a aa,每個格仔中有乙個整數。現在需要找到兩條從左上角 1,1 1,1 1,1 到右下角 n,m n,m n,m 的路徑,路徑上的每一步只能向右或向下走。路徑經過的格仔中的數會被取走。兩條路徑不能經過同乙個格仔。求取得的數之和最大是多少。n,m 50 n,m...

0x50 動態規劃(練習)20 乾草堆(題解)

題目鏈結 題意 奶牛們討厭黑暗。為了調整牛棚頂的電燈的亮度,bessie必須建一座乾草堆使得她能夠爬上去夠到燈泡。一共有n大包的乾草 從1到n編號 依靠傳送帶連續的傳輸進牛棚來。第i包乾草有乙個寬度wi。所有的幹草包的厚度和高度都為1。bessie必須利用所有n包乾草來建立起乾草堆。她可以想放多少包...

Acwing 0x50 動態規劃 沒有上司的舞會

題意 ural大學有n名職員,編號為 他們的關係就像一棵以校長為根的樹,父節點就是子節點的直接上司。每個職員有乙個快樂指數,用整數 現在要召開一場周年慶宴會,不過,沒有職員願意和直接上司一起參會。在滿足這個條件的前提下,主辦方希望邀請一部分職員參會,使得所有參會職員的快樂指數總和最大,求這個最大值。...