luogu2014 选课
【题目描述】
在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习。现在有N门功课,每门课有个学分,每门课有一门或没有直接先修课(若课程a是课程b的先修课即只有学完了课程a,才能学习课程b)。一个学生要从这些课程里选择M门课程学习,问他能获得的最大学分是多少?
【输入格式】
第一行有两个整数N,M用空格隔开。(1<=N<=300,1<=M<=300)
接下来的N行,第I+1行包含两个整数ki和si, ki表示第I门课的直接先修课,si表示第I门课的学分。若ki=0表示没有直接先修课(1<=ki<=N, 1<=si<=20)。
【输出格式】
只有一行,选M门课程的最大得分。
【代码】
1. 多叉转二叉
1 /* 2 User:Mandy.H.Y 3 Language:c++ 4 Problem:course 5 */ 6 #include<bits/stdc++.h> 7 using namespace std; 8 const int maxn = 320; 9 int f[maxn][maxn] , bro[maxn] , son[maxn], v[maxn]; 10 void add(int fa, int s) 11 //类似链表的存储 12 { 13 bro[s] = son[fa]; 14 //son[i]中存入i的第一个儿子 15 son[fa] = s; 16 //bro[i]中存入i的上一个兄弟 17 } 18 19 int dp(int i, int j) 20 //对于每一个i节点, 21 //定义dp(i,j)为i的所有兄弟和 i 的所有儿子,和 i 自己,学 j 门课的最大学分总和。 22 { 23 if (i==-1) return 0; 24 if (j==0) return 0; 25 if (f[i][j] != -1) return f[i][j]; 26 //记忆化 ,必备,在下面循环中son与bro有些会重算 27 int m = -1<<30; 28 //最小值 29 30 // 全分兄弟 31 m = max( m, dp(bro[i] , j)); 32 33 for (int k = 0; k <= j-1; k++) 34 //从0开始,表示不选 儿子,选i自己与j-1个兄弟 35 { 36 m = max( m , dp(son[i] , k) + dp(bro[i] , j-1-k) + v[i]); 37 /*那么,可以分成两种情况: 38 1、不学 i 这门课,全部学兄弟的课程,dp( i , j ) = dp( bro[ i ] , j) 39 2、学 i 以及以 i 为先修课的课程, dp( i , j ) = dp( bro[ i ] , j - 1 - k ) + dp( son[ i ] , k ) + v[ i ]*/ 40 } 41 f[i][j] = m; 42 return m; 43 } 44 int main() 45 { 46 memset(son , -1, sizeof(son)); 47 memset(bro , -1, sizeof(bro)); 48 memset(f , -1, sizeof(f )); 49 //初始化,必备,dfs中要用于判断 、,用0易混淆,易错 50 int n, m; 51 cin>>n>>m; 52 for(int i=1;i<=n;i++){ 53 int fa,vx; 54 cin>>fa>>vx; 55 add(fa,i); 56 v[i] = vx; 57 } 58 cout<<dp(0, m+1); 59 return 0; 60 }
2. 背包
1 /* 2 User:Mandy.H.Y 3 Language:c++ 4 Problem:course 5 */ 6 #include<bits/stdc++.h> 7 using namespace std; 8 9 int m,n,head[305],next1[305],f[305][305]; 10 11 void readdata() 12 { 13 scanf("%d%d",&n,&m); 14 for(int i=1;i<=n;i++) 15 { 16 int a; 17 scanf("%d%d",&a,&f[i][0]); 18 //a是第i门的直接先修课 19 //当a等于0时,无父亲的节点便接到0节点上,使树有且只有一个根 20 next1[i]=head[a]; 21 head[a]=i; 22 } 23 } 24 25 void init() 26 { 27 freopen("cour.txt","r",stdin); 28 freopen("cour.txt","w",stdout); 29 } 30 31 int deep(int x) 32 { 33 if(head[x]==0) return 0; 34 int zi=0; 35 //指已算过的科目的总数 36 for(int i=head[x];i!=0;i=next1[i]) 37 { 38 int izi=deep(i); 39 //t表示i的子结点的个数 40 zi=zi+izi+1; 41 for(int j=zi;j>=0;j--) 42 //01背包,一定要是降序,否则可能一个科目选两遍 43 for(int k=0;k<=izi;k++) 44 if(j-k-1>=0&&f[x][j-k-1]+f[i][k]>f[x][j]) f[x][j]=f[x][j-k-1]+f[i][k]; 45 //如果(还有空间选i及i的k个子结点) 46 } 47 return zi; 48 } 49 50 void work() 51 { 52 deep(0); 53 printf("%d",f[0][m]); 54 } 55 56 int main() 57 { 58 //init(); 59 readdata(); 60 work(); 61 return 0; 62 }
转载于:https://www.cnblogs.com/Mandy-H-Y/p/11355801.html
luogu2014 选课相关推荐
- Luogu2014选课
注意循环顺序 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ...
- 新生选课系统使用指南
建议选用IE6或者IE7浏览器. 打开浏览器,地址栏输入202.200.112.200, 或者202.200.112.202, 或者202.200.112.210.按回车键. 输入学号和身份证号(如果 ...
- python123注册需要输入真实姓名和学校吗_python-----作业完成--学校选课系统
选课系统: 角色:学校.学员.课程.讲师 要求: 1. 创建北京.上海 2 所学校 2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开 3. ...
- Java项目:网上选课系统(java+SSM+jsp+mysql+maven)
源码获取:博客首页 "资源" 里下载! 一.项目简述 功能: 系统分为三个角色.最高权限管理员,学生,教师,包括 学生管理,教师管理,课程管理,选课,退课,成绩查 询.,教学课程, ...
- 选课微信小程序开发 java
1.使用技术 java springboot mysql hibernate 微信小程序 2.功能介绍 后台管理 学生管理 课程管理 类型管理 选课管理 操作中心 管理员中心 导入导出学生 微信小程序 ...
- 基于协同过滤算法实现选课推荐系统
新版本教务管理系统 教务管理系统 选课功能 1.系统功能 1.用户账户管理 2.学生个人信息的查看与修改 3.学生的网上选课与课程的评分 4.教师个人信息的查看与修改 5.教师对学生课程评价结果的查看 ...
- 【每日DP】day 8、P2014 [CTSC1997]选课(树形DP(树形背包)模板)难度⭐⭐⭐
P2014 [CTSC1997]选课 题意为选一门课前要看它是否有前提条件:即选了一门主课才能选 "副科",所以可以树形背包来做. 注意是不能用分组背包来做,因为这道题附件有很多个 ...
- 清华大数据能力提升项目《数据分析方法》选课开始 !(附旁听名额)
大数据背景下,信息类专业人才在各个行业的需求量巨大的同时,也在综合能力上提出了新的要求,不仅需要掌握对大数据进行高效处理的工具和平台搭建.分析和处理的理论方法,而且需要数据人才对行业知识的了解及应用. ...
- 新课程网上选课系统V1.0—适用于中小学校本课程选课、选修课选课
学校要开设选修课,人工选课实施了两年,耗时耗力,于是打算用网上选课,在网上搜索了一番,没多少实用的,有一个网上用的比较多的,功能太简单了,于是打算自己开发一个,功能参考了部分学校的功能,也有基于Aja ...
- 基于SSM选课信息管理系统
项目编号:KS006 运行环境 jdk8+tomcat8+mysql5.6+IntelliJ IDEA+maven 项目技术 spring+spring mvc+mybatis+j ...
最新文章
- Active Directory管理之十一:升级Active Directory(上)
- ARKit如何将太阳系装进iPhone(二)
- android 输入锁屏密码错误,安卓系统手机锁屏密码输错被停用了如何解决
- JavaScript中使用字符串调用函数
- ( 流水账1)周五--liphi--校服的联想
- win10任务栏怎么还原到下面_Windows10 系统桌面底部的任务栏在侧边了怎么还原
- 【mxnet速成】mxnet图像分类从模型自定义到测试
- Android学习起步 - 新建工程及相关
- mvc路由 html,asp.net-mvc – ASP.NET MVC路由从html页面开始
- Swift快速入门(一)第一个Swift程序
- Damon Edwards:IT运营是最可预测的DevOps差异化因素
- 大数据好还是不好_学python好还是大数据好?想学IT,但有点搞不清方向的人可以看看...
- python for循环 内存_python中for循环的内存分配
- 募捐:请帮助一名 Linux 程序员的女儿
- iperf详细使用方法
- 局域网IP扫描软件(softperfect network scanner中文版) v7.2.9
- 毕设-基于JavaWeb体育竞赛管理系统
- Hive实现获取指定月的第一天和最后一天
- PMP-37项目采购管理
- 华南植物园除夕牡丹花展 近万盆鲜花将亮相
热门文章
- Ionic开发App中重要的部分
- 【SDOI2014】数表
- 项目owner看这里,MaxCompute全表扫描新功能,给你“失误”的机会
- 世界独创的螺旋数组低于n(o^2)的生成算法
- nginx内核优化及配置
- hive启动报错 java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7B
- java 基础知识3
- iOS UITextField设置起始字符开始位置
- 国外大牛最终还是放弃迁移到微服务,为什么?
- Java会走向晦暗吗?Kotlin会取而代之吗