時間限制: 1 s
空間限制: 128000 kb
題目等級 : 鑽石 diamond
題解
檢視執行結果
學校實行學分制。每門的必修課都有固定的學分,同時還必須獲得相應的選修課程學分。學校開設了n(n<300)門的選修課程,每個學生可選課程的數量m是給定的。學生選修了這m門課並考核通過就能獲得相應的學分。
在選修課程中,有些課程可以直接選修,有些課程需要一定的基礎知識,必須在選了其它的一些課程的基礎上才能選修。例如《frontpage》必須在選修了《windows操作基礎》之後才能選修。我們稱《windows操作基礎》是《frontpage》的先修課。每門課的直接先修課最多只有一門。兩門課也可能存在相同的先修課。每門課都有乙個課號,依次為1,2,3,…。 例如:
【詳見】
表中1是2的先修課,2是3、4的先修課。如果要選3,那麼1和2都一定已被選修過。 你的任務是為自己確定乙個選課方案,使得你能得到的學分最多,並且必須滿足先修課優先的原則。假定課程之間不存在時間上的衝突。
輸入描述 input description
輸入檔案的第一行包括兩個整數n、m(中間用乙個空格隔開)其中1≤n≤300,1≤m≤n。
以下n行每行代表一門課。課號依次為1,2,…,n。每行有兩個數(用乙個空格隔開),第乙個數為這門課先修課的課號(若不存在先修課則該項為0),第二個數為這門課的學分。學分是不超過10的正整數。
輸出描述 output description
輸出檔案只有乙個數,實際所選課程的學分總數。
樣例輸入 sample input
7 42 2
0 10 4
2 17 1
7 62 2
樣例輸出 sample output
13 資料範圍及提示 data size & hint
各個測試點1s
#include#include#include#include#include#define n 3000
using namespace std;
int n,m;
int point[n],next[n],v[n],c[n],tot;
int f[n][n],size[n],deep[n],g[n];
void add(int x,int y)
void dfs(int x,int fa)
}void dp(int x,int fa,int k)
} f[x][0]=0;
for (int j=size[x]-1;j>=0;j--)
f[x][j+1]=f[x][j]+c[x];
}int main()
m++;
deep[0]=1;
dfs(0,0);
dp(0,0,m);
printf("%d\n",f[0][m]);
}
codevs1378 選課 樹形DP
學校實行學分制。每門的必修課都有固定的學分,同時還必須獲得相應的選修課程學分。學校開設了n n 300 門的選修課程,每個學生可選課程的數量m是給定的。學生選修了這m門課並考核通過就能獲得相應的學分。在選修課程中,有些課程可以直接選修,有些課程需要一定的基礎知識,必須在選了其它的一些課程的基礎上才能...
codevs1378 選課 樹形dp
codevs1378 選課 題目描述 description 學校實行學分制。每門的必修課都有固定的學分,同時還必須獲得相應的選修課程學分。學校開設了n n 300 門的選修課程,每個學生可選課程的數量m是給定的。學生選修了這m門課並考核通過就能獲得相應的學分。在選修課程中,有些課程可以直接選修,有...
codevs 1378 選課 (樹形dp)
go to the problem 時間限制 1 s 空間限制 128000 kb 學校實行學分制。每門的必修課都有固定的學分,同時還必須獲得相應的選修課程學分。學校開設了n n 300 門的選修課程,每個學生可選課程的數量m是給定的。學生選修了這m門課並考核通過就能獲得相應的學分。在選修課程中,有...