题目限制
时间限制 内存限制 评测方式 题目来源
1000ms 131072KiB 标准比较器 Local
题目描述
学校实行学分制。每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分。学校开设了N(N<300)门的选修课程,每个学生可选课程的数量M是给定的。学生选修了这M门课并考核通过就能获得相应的学分。   在选修课程中,有些课程可以直接选修,有些课程需要一定的基础知识,必须在选了其它的一些课程的基础上才能选修。例如《Frontpage》必须在选修了《Windows操作基础》之后才能选修。我们称《Windows操作基础》是《Frontpage》的先修课。每门课的直接先修课最多只有一门。两门课也可能存在相同的先修课。每门课都有一个课号,依次为1,2,3,…。 例如: 表中1是2的先修课,2是3、4的先修课。如果要选3,那么1和2都一定已被选修过。   你的任务是为自己确定一个选课方案,使得你能得到的学分最多,并且必须满足先修课优先的原则。假定课程之间不存在时间上的冲突。 输入格式
输入文件的第一行包括两个整数N、M(中间用一个空格隔开)其中1≤N≤300,1≤M≤N。
以下N行每行代表一门课。课号依次为1,2,…,N。每行有两个数(用一个空格隔开),第一个数为这门课先修课的课号(若不存在先修课则该项为0),第二个数为这门课的学分。学分是不超过10的正整数。 输出格式
输出文件只有一个数,实际所选课程的学分总数。 样例数据
输入样例 #1 输出样例 #1
7 4
2 2
0 1
0 4
2 1
7 1
7 6
2 2
13

树上的分组背包。

容积:m

对于一个节点x,物品组数为其子节点个数,每组物品有[0,m-1]的体积,对应每个体积vi的价值为f[son[x][i],vi]

就解决了“分配”课程的问题


#include<iostream>
#include<cstdio> using namespace std; const int MAXN=500; int n,m;
int f[MAXN][MAXN];
int val[MAXN]; struct Edge{
int next,to;
}e[MAXN];
int ecnt,head[MAXN];
inline void add(int x,int y){
e[++ecnt].next = head[x];
e[ecnt].to = y;
head[x] = ecnt;
}
int ind[MAXN]; int dfs(int x){
int sum=0;
for(int i=head[x];i;i=e[i].next){
int v=e[i].to;
int t=dfs(v);
sum+=t+1;
for(int j=sum;j>=0;j--){
for(int k=j;k>=0;k--){
f[x][j]=max(f[x][j],f[x][j-k]+f[v][k]);
}
}
}
if(x) for(int i=m;i>=1;i--) f[x][i]=f[x][i-1]+val[x];
return sum;
} int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
int x;
cin>>x>>val[i];
add(x,i);
}
dfs(0);
cout<<f[0][m]<<endl; }

[JOYOI] 1051 选课的更多相关文章

  1. [vijos P1180] 选课

    这一周竟然都没好好码题目,不过至少把这题的树形DP给摸了个大概.吐槽一下自己,递归已经基本不会用了…QAQ!按老师的话来说“太危险了!” 此题用到多叉树转二叉树,左孩子是真正意义的孩子(先修完自己才能 ...

  2. joyOI 选课 【树形dp + 背包dp】

    题目链接 选课 题解 基础背包树形dp #include<iostream> #include<cstdio> #include<cmath> #include&l ...

  3. HDOJ 1051. Wooden Sticks 贪心 结构体排序

    Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  4. 1051. Pop Sequence

    原题连接:https://www.patest.cn/contests/pat-a-practise/1051 题目: Given a stack which can keep M numbers a ...

  5. 从零开始学Python06作业思路:学生选课系统

    一,作业要求 选课系统: 管理员: 创建老师:姓名.性别.年龄.资产 创建课程:课程名称.上课时间.课时费.关联老师 学生:用户名.密码.性别.年龄.选课列表[].上课记录{课程1:[di,a,]} ...

  6. python之选课系统详解[功能未完善]

    作业需求 思路:1.先写出大体的类,比如学校类,学生类,课程类--   2.写出类里面大概的方法,比如学校类里面有创建讲师.创建班级-- 3.根据下面写出大致的代码,并实现其功能       遇到的困 ...

  7. 第一章-第六题(帮人抢票,帮人选课这些软件是否合法 你怎么看?)--By梁旭晖

    我觉得这些软件是合法的,符合道德规范的. 计算机当初设计的初衷就是简化甚至替代人类的工作.而软件作为计算机硬件的驱动着,其设计就是体现这些原则. 现在互联网上的订票,选课类型的网站还是有很多的,比如: ...

  8. Python开发程序:选课系统-改良版

    程序名称: 选课系统 角色:学校.学员.课程.讲师要求:1. 创建北京.上海 2 所学校2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开3. ...

  9. SQL Server 【附】创建"商品管理数据库"、"学生选课数据库"的SQL语句

    附:(创建“商品管理数据库”的SQL语句) --建立"商品管理数据库"数据库-- create database 商品管理数据库 on(name='商品管理数据库_m', file ...

随机推荐

  1. How to Compare Means (均值比较)

    在比较数据的均值时,我们可能知道: 比较工厂当天生产的零件的长度是否合格 (length >= N mm),用 t-Test; 比较各一线城市的人均收入,用 ANOVA. 其实均值比较还有很多检 ...

  2. python列表和元组的常用操作

    一.列表 需要安利一下:列表和字符串数是不一样的.进行操作时列表可以发生改变,而字符串不可以,所以直接在原来的对象上操作. 1.列表的增加 def append(self, p_object): # ...

  3. 51nod 1874 字符串排序

    1874 字符串排序  基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题  收藏  关注 定义一个字符串的无序度为所有位置后面的字母比该位置的字母小的总数之和.比如&q ...

  4. APP增量更新

    增量更新的概念: 当我们手机上安装的app版本与服务器的最新版本不一致的时候,传统做法是重新下载安装一个最新版的apk文件,不过这种方式比较耗流量,不利于用户体验.增量更新就是只下载当前app版本与最 ...

  5. vue项目中安装cnpm和node_modules

    1.安装cnpm的nodejs包管理工具,命令行: npm install -g cnpm --registry=https://registry.npm.taobao.org   2. 每个vue项 ...

  6. Bmob使用心得

    1.在 Project 的 build.gradle 文件中添加 Bmob的maven仓库地址,示例如下:(注意文字说明部分): allprojects { repositories { jcente ...

  7. sql把两值之和当作条件进行查询

    目的:把表中两个字段之和作为where条件进行过滤查询 //查询在没有过期的记录select a,b from test where a+b>now();// a:存入时间 b:有效期时间段 进 ...

  8. quazip非静态成员。。错误

    转载请注明出处:http://www.cnblogs.com/dachen408/p/7147155.html 问题:quazip非静态成员..错误 解决方案:quazip_global.h  第42 ...

  9. Vue.js——打包之后资源路径产生问题

    https://blog.csdn.net/qq_30632003/article/details/79353035 https://www.cnblogs.com/diantao/p/7776523 ...

  10. 集成新版(5.17+)Activiti Modeler与Rest服务

    声明: 此教程适合Activiti 5.17+版本. 本博客所涉及的内容均可在kft-activiti-demo中找到. 在线demo可以访问 http://demo.kafeitu.me:8080/ ...