[洛谷-P2014] [CTSC1997] 选课(树形背包DP)
创始人
2024-06-01 12:06:12
0

[洛谷-P2014] [CTSC1997] 选课

  • 一、问题
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
  • 二、分析
  • 三、代码

一、问题

题目描述

在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习。现在有 NNN 门功课,每门课有个学分,每门课有一门或没有直接先修课(若课程 a 是课程 b 的先修课即只有学完了课程 a,才能学习课程 b)。一个学生要从这些课程里选择 MMM 门课程学习,问他能获得的最大学分是多少?

输入格式

第一行有两个整数 NNN , MMM 用空格隔开。( 1≤N≤3001 \leq N \leq 3001≤N≤300 , 1≤M≤3001 \leq M \leq 3001≤M≤300 )

接下来的 NNN 行,第 I+1I+1I+1 行包含两个整数 $k_i $和 sis_isi​, kik_iki​ 表示第I门课的直接先修课,sis_isi​ 表示第I门课的学分。若 ki=0k_i=0ki​=0 表示没有直接先修课(1≤ki≤N1 \leq {k_i} \leq N1≤ki​≤N , 1≤si≤201 \leq {s_i} \leq 201≤si​≤20)。

输出格式

只有一行,选 MMM 门课程的最大得分。

样例 #1

样例输入 #1

7  4
2  2
0  1
0  4
2  1
7  1
7  6
2  2

样例输出 #1

13

二、分析

这道题是一道很典型的树形背包DP问题的模板题目。这道题唯一需要注意的是,由于每个课都有一个先选课。所以最终这些课程之间的关系会构成一个森林,但是我们的树形DP是在一棵树上进行的,所以我们需要将这些割裂的子树用一个节点统一起来,我们把这个这节点编号为000,这个根叫做超根
那么这个超根我们是要选择的,只不过它对答案的贡献是0。也就是说我们需要选择的是M+1M + 1M+1个节点。

如果不懂树形背包DP的话,可以看作者之前的文章,讲解很详细:AcWing 10. 有依赖的背包问题(分组背包问题 + 树形DP)

三、代码

这里写的是空间优化后的代码。

#include
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair pii;
const int N = 300+ 10;
vectoredge[N];
int f[N][N];
int score[N];
int n, m;void dp(int u, int M)
{f[u][1] = score[u];for(int i = 0; i < edge[u].size(); i ++ ){int son = edge[u][i];dp(son, M - 1);for(int j = M; j >= 0; j -- ){for(int q = 0; q <= j - 1; q ++ ){f[u][j] = max(f[u][j - q] + f[son][q], f[u][j]);}}}
}void solve()
{cin >> n >> m;for(int i = 0; i < n; i ++ ){int x, y;cin >> x >> y;score[i + 1] = y;edge[x].push_back(i + 1);}dp(0, m + 1);cout << f[0][m + 1] << endl;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);solve();
}

相关内容

热门资讯

润禾材料涨2.27%,成交额1... 5月12日,润禾材料盘中上涨2.27%,截至09:35,报39.18元/股,成交1948.55万元,...
众源新材涨2.04%,成交额1... 5月12日,众源新材盘中上涨2.04%,截至09:40,报10.02元/股,成交1926.44万元,...
浔兴股份跌2.54%,成交额1... 5月12日,浔兴股份(维权)盘中下跌2.54%,截至09:41,报9.20元/股,成交1.01亿元,...
突发!金价大跌,A股港股高开!... 每经编辑|毕陆名 刚刚过去的这个周末,大事频发,随着中美贸易谈判出现积极进展、印巴...
捷强装备跌2.15%,成交额7... 5月12日,捷强装备盘中下跌2.15%,截至09:35,报29.58元/股,成交7273.96万元,...
厚普股份涨2.06%,成交额2... 5月12日,厚普股份盘中上涨2.06%,截至09:40,报9.91元/股,成交2302.99万元,换...
东芯股份涨2.01%,成交额5... 5月12日,东芯股份盘中上涨2.01%,截至09:40,报32.52元/股,成交5488.77万元,...
菲利华涨2.01%,成交额72... 5月12日,菲利华盘中上涨2.01%,截至09:42,报48.75元/股,成交7210.29万元,换...
富满微涨2.01%,成交额23... 5月12日,富满微盘中上涨2.01%,截至09:41,报30.41元/股,成交2314.82万元,换...
5月12日人民币对美元中间价报... 中新网5月12日电 据中国外汇交易中心网站消息,中国人民银行授权中国外汇交易中心公布,2025年5月...
梦洁股份跌2.07%,成交额1... 5月12日,梦洁股份(维权)盘中下跌2.07%,截至09:42,报3.79元/股,成交1906.76...
盛泰集团跌2.02%,成交额1... 5月12日,盛泰集团盘中下跌2.02%,截至09:41,报6.30元/股,成交1688.14万元,换...
普利退涨2.67%,成交额24... 5月12日,普利退(维权)盘中上涨2.67%,截至09:42,报0.77元/股,成交246.72万元...
西部超导涨2.00%,成交额8... 5月12日,西部超导盘中上涨2.00%,截至09:41,报50.90元/股,成交8972.82万元,...
锂电池ETF(561160)开... 5月12日,锂电池ETF(561160)开盘涨1.27%,报0.479元。锂电池ETF(561160...
中药50ETF(562390)... 5月12日,中药50ETF(562390)开盘涨0.32%,报0.952元。中药50ETF(5623...
新能源车龙头ETF(15963... 5月12日,新能源车龙头ETF(159637)开盘涨0.66%,报0.611元。新能源车龙头ETF(...
机床ETF(159663)开盘... 5月12日,机床ETF(159663)开盘涨0.90%,报1.122元。机床ETF(159663)重...
碳中和龙头ETF(159640... 5月12日,碳中和龙头ETF(159640)开盘涨0.54%,报0.742元。碳中和龙头ETF(15...
交运ETF(159662)开盘... 5月12日,交运ETF(159662)开盘涨0.20%,报0.991元。交运ETF(159662)重...