Description

学校实行学分制。每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分。学校开设了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 4
2 2
0 1
0 4
2 1
7 1
7 6
2 2

Sample Output

13

树形DP入门题,需要多叉转二叉,左儿子右兄弟,详情见代码,f[u][pick] 为点 u 选 pick个课程的最优解,对于每个节点有选或不选两种决策,对于拿的情况,枚举节点 u 拿多少个儿子,剩下的余给右兄弟。
代码如下

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int size = 1010;
const int sz = 200010;
int val[size];
int dist[size];
int r[size];
int len,n,m;
int head[sz],nxt[sz],l[sz];
int tot = 1;
bool use[size];
int f[size][size]; // f[i][j] 第 i 个节点
void build(int f,int t)
{l[tot] = t;nxt[tot] = head[f];head[f] = tot ++;
}
struct gtnd
{int l, r;
}tree[size];
queue < int > q;
int read()
{int x = 0 , f = 1;char in = getchar();while(in < '0' || in > '9'){if(in == '-')f = -1;in = getchar();}while(in >= '0' && in <= '9'){x = (x << 3) + (x << 1) + in - '0';in = getchar();}return x * f;
}
int dfs(int u,int pick)
{if(!u)return 0;if(f[u][pick])return f[u][pick];for(int i = 0 ; i <= pick - 1 ; i ++)f[u][pick] = max(f[u][pick],dfs(tree[u].l,i)+val[u]+dfs(tree[u].r,pick-i-1));f[u][pick] = max(f[u][pick],dfs(tree[u].r,pick));return f[u][pick];
}
int main()
{n = read() , m = read();for(int i = 1 ; i <= n ; i ++){int par = read();val[i] = read();if(tree[par].l)tree[i].r = tree[par].l;tree[par].l = i;}printf("%d\n",dfs(tree[0].l,m));return 0;
}

Ctsc1997 选课相关推荐

  1. 【每日DP】day 8、P2014 [CTSC1997]选课(树形DP(树形背包)模板)难度⭐⭐⭐

    P2014 [CTSC1997]选课 题意为选一门课前要看它是否有前提条件:即选了一门主课才能选 "副科",所以可以树形背包来做. 注意是不能用分组背包来做,因为这道题附件有很多个 ...

  2. P2014 [CTSC1997] 选课(树形dp)

    题目链接 1 有前驱 2 有权值 可以联想到 是个森林结构 0代表空 如果把0看成根节点的话 就成了一个树 我们可以增加一个课容量 然后把0加入选课 就避免了森林结构 用前向星存图 把每个节点的子节点 ...

  3. [CTSC1997] 选课

    #include<iostream> #include<cstdio>  using namespace std; int n,m,b[305],a[305][305],f[3 ...

  4. (P2014[CTSC1997])选课(树上背包)

    题目链接:[CTSC1997] 选课 - 洛谷 分析:这是一道树上背包的模板题,什么是树上背包呢?就是说物品之间有依赖关系,就比如说选a就必须要先选b,选b又必须要先选c,大概就是这个意思,类似于我们 ...

  5. 0x54. 动态规划 - 树形DP(习题详解 × 12)

    目录 0x54.1 树形DP Problem A. 没有上司的舞会 Problem B. 战略游戏 0x54.2 树上背包 Problem A. 选课 Problem B.[数据加强版]选课(树上背包 ...

  6. CSP难度的经典题目/有趣的思维题选讲(一)

    引言 这里讲到的难题是一部分非常典型的题目,但并不是所有.因此这并非是一个全面的知识列表,而只适合提高组同学用来提升能力和拓展视野. 这篇文章在很多地方讲述的不够详细和严谨,因为它的作用并非是题解,而 ...

  7. 2021/7/8——集训Day.3

    (如果我以后不说睡了个好觉就默认是失眠了) 早上吃的卷饼里面有一截头发,上次吃到头发也是他们家,真离谱 到了机房焦老师说学校的"教育网"能提前一点查成绩,羟基班的人查出来都还不错 ...

  8. 第45期:动态规划-背包问题

    目录 1. 01背包 1. 2. 01背包问题 - AcWing题库 2.完全背包(无限背包) 1. 疯狂的采药 - 洛谷 3.多重背包 二进制优化多重背包 单调队列优化多重背包 4. 树形背包 1. ...

  9. 打卡第二天 树形DP初步

    1.P1352 没有上司的舞会 题目概述: 有n个人,除老板外每个人都有自己的上司k和快乐值l,但每个人都不能和自己的上司同时出现在舞会上,舞会的快乐值为所有到达舞会的人的快乐值总和,求其最大值. 题 ...

最新文章

  1. mysql添加和root用户一样的权限
  2. 建议收藏:服务器和存储技术知识
  3. 基于vue-cli配置手淘的lib-flexible + rem,实现移动端自适应
  4. 数据库系列之mysql 自定义函数function,函数和存储过程的区别
  5. VirtualBox虚拟机与主机互相访问开启
  6. PSP自制系统3.xxOE相关内容
  7. 第五次作业11111
  8. java客户端实验_java实验(客户端) 2015106宋世超
  9. freemarker的下拉框回显
  10. Nebula 分布式图数据库介绍
  11. rhel6.cacti的安装与配置
  12. 牛顿的广义二项式定理---微积分推倒的开始
  13. c语言设计无纸化考试系统多少钱,无纸化考试系统解决方案
  14. 测试人员只能点点点?深度剖析测试人员如何变得更优秀
  15. 使用 制作出漂亮的图表
  16. 计算机系统软件和应用软件的区别
  17. 利用腾讯会议开展远程面试的解决方案
  18. 二叉树的中序遍历和后序遍历算法
  19. (资讯)华为员工利用Bug越权访问机密卖给第三方,获利1.6万元,被判有期徒刑一年
  20. IT行业零基础可以学习吗?

热门文章

  1. 当下互联网环境下物理主机和云主机到底哪个好?
  2. 另眼相看“那些争议最大的编程观点”
  3. matlab逆变的参数设计,基于Matlab的孤立逆变电源设计方案 - 全文
  4. 中国全碳化硅电源模块市场趋势报告、技术动态创新及市场预测
  5. 小视频去水印原理及其代码?
  6. 古文观止卷七_諫太宗十思疏_魏徵
  7. 史元春计算机科学导论,计算机科学导论Introduction1.pdf
  8. 双人成形 NSpro手柄 识别问题
  9. delphi RM格式的播放器的技巧
  10. cmake version not allowed unless cmp0048 is set to new