【题目描述】

在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习。现在有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 选课相关推荐

  1. Luogu2014选课

    注意循环顺序 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ...

  2. 新生选课系统使用指南

    建议选用IE6或者IE7浏览器. 打开浏览器,地址栏输入202.200.112.200, 或者202.200.112.202, 或者202.200.112.210.按回车键. 输入学号和身份证号(如果 ...

  3. python123注册需要输入真实姓名和学校吗_python-----作业完成--学校选课系统

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

  4. Java项目:网上选课系统(java+SSM+jsp+mysql+maven)

    源码获取:博客首页 "资源" 里下载! 一.项目简述 功能: 系统分为三个角色.最高权限管理员,学生,教师,包括 学生管理,教师管理,课程管理,选课,退课,成绩查 询.,教学课程, ...

  5. 选课微信小程序开发 java

    1.使用技术 java springboot mysql hibernate 微信小程序 2.功能介绍 后台管理 学生管理 课程管理 类型管理 选课管理 操作中心 管理员中心 导入导出学生 微信小程序 ...

  6. 基于协同过滤算法实现选课推荐系统

    新版本教务管理系统 教务管理系统 选课功能 1.系统功能 1.用户账户管理 2.学生个人信息的查看与修改 3.学生的网上选课与课程的评分 4.教师个人信息的查看与修改 5.教师对学生课程评价结果的查看 ...

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

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

  8. 清华大数据能力提升项目《数据分析方法》选课开始 !(附旁听名额)

    大数据背景下,信息类专业人才在各个行业的需求量巨大的同时,也在综合能力上提出了新的要求,不仅需要掌握对大数据进行高效处理的工具和平台搭建.分析和处理的理论方法,而且需要数据人才对行业知识的了解及应用. ...

  9. 新课程网上选课系统V1.0—适用于中小学校本课程选课、选修课选课

    学校要开设选修课,人工选课实施了两年,耗时耗力,于是打算用网上选课,在网上搜索了一番,没多少实用的,有一个网上用的比较多的,功能太简单了,于是打算自己开发一个,功能参考了部分学校的功能,也有基于Aja ...

  10. 基于SSM选课信息管理系统

    项目编号:KS006 运行环境     jdk8+tomcat8+mysql5.6+IntelliJ IDEA+maven   项目技术     spring+spring mvc+mybatis+j ...

最新文章

  1. Active Directory管理之十一:升级Active Directory(上)
  2. ARKit如何将太阳系装进iPhone(二)
  3. android 输入锁屏密码错误,安卓系统手机锁屏密码输错被停用了如何解决
  4. JavaScript中使用字符串调用函数
  5. ( 流水账1)周五--liphi--校服的联想
  6. win10任务栏怎么还原到下面_Windows10 系统桌面底部的任务栏在侧边了怎么还原
  7. 【mxnet速成】mxnet图像分类从模型自定义到测试
  8. Android学习起步 - 新建工程及相关
  9. mvc路由 html,asp.net-mvc – ASP.NET MVC路由从html页面开始
  10. Swift快速入门(一)第一个Swift程序
  11. Damon Edwards:IT运营是最可预测的DevOps差异化因素
  12. 大数据好还是不好_学python好还是大数据好?想学IT,但有点搞不清方向的人可以看看...
  13. python for循环 内存_python中for循环的内存分配
  14. 募捐:请帮助一名 Linux 程序员的女儿
  15. iperf详细使用方法
  16. 局域网IP扫描软件(softperfect network scanner中文版) v7.2.9
  17. 毕设-基于JavaWeb体育竞赛管理系统
  18. Hive实现获取指定月的第一天和最后一天
  19. PMP-37项目采购管理
  20. 华南植物园除夕牡丹花展 近万盆鲜花将亮相

热门文章

  1. Ionic开发App中重要的部分
  2. 【SDOI2014】数表
  3. 项目owner看这里,MaxCompute全表扫描新功能,给你“失误”的机会
  4. 世界独创的螺旋数组低于n(o^2)的生成算法
  5. nginx内核优化及配置
  6. hive启动报错 java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7B
  7. java 基础知识3
  8. iOS UITextField设置起始字符开始位置
  9. 国外大牛最终还是放弃迁移到微服务,为什么?
  10. Java会走向晦暗吗?Kotlin会取而代之吗