当前位置: 首页 > news >正文

题解:洛谷 P2014 [CTSC1997] 选课

【题目来源】

洛谷:P2014 [CTSC1997] 选课 - 洛谷

【题目描述】

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

【输入】

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

接下来的 N 行,第 I+1 行包含两个整数 kisi, ki 表示第I门课的直接先修课,si 表示第I门课的学分。若 ki=0 表示没有直接先修课(1≤kiN , 1≤si≤20)。

【输出】

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

【输入样例】

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

【输出样例】

13

【算法标签】

《洛谷 P2014 选课》 #动态规划,dp# #搜索# #树形dp# #WC|CTSC|集训队# #1997#

【代码详解】

#include <bits/stdc++.h>
using namespace std;int n, m;               // n: 课程总数(不包括虚拟根节点0),m: 需要选择的课程数
int s[305];             // 存储每门课程的学分
vector<int> G[305];     // 图的邻接表表示,G[x]表示x的所有子节点(课程)
int f[305][305][305];   // 动态规划数组,f[x][i][j]表示以x为根的子树中,考虑前i个子树,选j门课的最大学分/*** 深度优先搜索进行动态规划* @param x 当前处理的课程节点*/
void dfs(int x)
{// 先递归处理所有子节点for (auto v : G[x]){dfs(v);}// 初始化:选择当前节点或不选当前节点f[x][1][1] = s[x];  // 选择当前节点f[x][1][0] = 0;     // 不选当前节点// 动态规划处理for (int i = 2; i < G[x].size() + 2; i++)  // 遍历所有子节点(+2是因为初始i从2开始){int v = G[x][i - 2];  // 当前处理的子节点for (int j = 0; j <= n; j++)          // 遍历可能选择的课程数{for (int k = 0; k < j; k++)       // 遍历在当前子树中可能选择的课程数{// 状态转移方程f[x][i][j] = max(f[x][i][j], f[v][G[v].size() + 1][k] + f[x][i - 1][j - k]);}}}
}int main()
{// 输入数据cin >> n >> m;for (int i = 1; i <= n; i++){int x;cin >> x >> s[i];          // 输入先修课和学分G[x].push_back(i);         // 构建课程依赖关系图}// 从虚拟根节点0开始处理dfs(0);// 输出结果:在虚拟根节点下选择m+1门课(包含虚拟根节点)cout << f[0][G[0].size() + 1][m + 1] << endl;return 0;
}

【运行结果】

7  4
2  2
0  1
0  4
2  1
7  1
7  6
2  2
13
http://www.jsqmd.com/news/397119/

相关文章:

  • 武汉疆灵科技:深耕低空经济 打造无人机,具身智能人形机器人载人无人驾驶航空器维修与维修人才技能培训全国标杆 - 速递信息
  • 精准对接上海智推时代:官方沟通入口全收 - 速递信息
  • 题解:洛谷 P1063 [NOIP 2006 提高组] 能量项链
  • 动态中位数
  • 题解:洛谷 P2015 二叉苹果树
  • Solution - P4241 采摘毒瘤
  • 题解:洛谷 P1352 没有上司的舞会
  • 使用iOS安全API进行数据加密、解密、签名与验证完整指南
  • 题解:洛谷 P1070 [NOIP 2009 普及组] 道路游戏
  • 如何修复 Chrome Devtools Console 中无法粘贴代码的问题 All In One
  • Trae和Trae团队和Trae技术
  • 题解:洛谷 P1880 [NOI1995] 石子合并
  • COMSOL 隧道断层突水案例探究:不同开挖步数下的围岩奥秘
  • 题解:洛谷 P1435 [IOI 2000] 回文字串
  • Java 时间类(中):JDK8 全新时间 API 详细教程
  • 降AI率常见误区TOP10:别再走弯路了!2026年最全避坑指南
  • <P5464 缩小社交圈>
  • 支持实时预览与高质量导出的专业封面设计工具,完全免费:西瓜封面设计
  • 文科论文降AI比理工科更难?文科生专属降AI方案全解析
  • 题解:洛谷 P1541 [NOIP 2010 提高组] 乌龟棋
  • PEM 电解槽直流道两相流模拟:从建模到求解
  • 手把手教你使用vscode开发stm32!
  • 题解:洛谷 P1854 [IOI 1999] 花店橱窗布置
  • 题解:洛谷 P4310 绝世好题
  • 中华民族音乐传承出版工程服务平台界面设计
  • 用DeepSeek写的论文怎么降AI率?2026最新实操教程手把手教你
  • 2026毕业季降AI全攻略:从论文写作到最终提交一站式指南
  • 法智学教育软件课件UI设计
  • 【Python】【机器学习】集成算法(随机森林、提升算法)
  • 中小企业全生命周期知识产权管理100问:从初创到成熟,一文读懂核心要点