【LOJ#10154】选课
题目中所说的每门课都可能有先修课,也可能没有先修课,因此课与课之间的关系构成了一颗森林。
这种树上选择若干物品的最优解问题对应着树形背包问题。
阶段:子树的大小
状态:在当前子树中,选取 i 门课能够获得的最多学分
状态转移方程:\(dp[u][t]=max\{\Sigma_{i=1}^pdp[v_i][c_i] \}+mark[u],\Sigma_{i=1}^pc_i=t-1\)
这种从每棵子树中选取若干物品的最优解问题可以转化成一个分组背包问题,其中子树的数量对应着物品组数,子树中选择的课程数量构成组内物品,符合每次只能在子树中选择一个固定的课程数量。
代码如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn=310;
int n,m,dp[maxn][maxn],mark[maxn];
vector<int> G[maxn];
inline void add_edge(int from,int to){G[from].push_back(to);}
void read_and_parse(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
int pre;scanf("%d%d",&pre,&mark[i]);
add_edge(pre,i);
}
}
void dfs(int u){
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
dfs(v);
for(int j=m;j>=0;j--)//倒序循环
for(int k=0;k<=j;k++)
dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]);
}
if(u!=0)
for(int j=m;j>=1;j--)
dp[u][j]=dp[u][j-1]+mark[u];
}
void solve(){
dfs(0);
printf("%d\n",dp[0][m]);
}
int main(){
read_and_parse();
solve();
return 0;
}
【LOJ#10154】选课的更多相关文章
- YBT 5.2 树形动态规划
题解在代码中 二叉苹果树[loj 10153] /* 若要留q条边便是要留q+1个点 所以记忆化搜索 dp[pos][ans]=max(dp[pos][ans],dp[l[pos]][k]+dp[r[ ...
- loj题目总览
--DavidJing提供技术支持 现将今年7月份之前必须刷完的题目列举 完成度[23/34] [178/250] 第 1 章 贪心算法 √ [11/11] #10000 「一本通 1.1 例 1」活 ...
- LOJ 一本通一句话题解系列:
第一部分 基础算法 第 1 章 贪心算法 1):「一本通 1.1 例 1」活动安排:按照结束时间排序,然后扫一遍就可以了. 2):「一本通 1.1 例 2」种树:首先要尽量的往区间重叠的部分种树,先按 ...
- 从零开始学Python06作业思路:学生选课系统
一,作业要求 选课系统: 管理员: 创建老师:姓名.性别.年龄.资产 创建课程:课程名称.上课时间.课时费.关联老师 学生:用户名.密码.性别.年龄.选课列表[].上课记录{课程1:[di,a,]} ...
- python之选课系统详解[功能未完善]
作业需求 思路:1.先写出大体的类,比如学校类,学生类,课程类-- 2.写出类里面大概的方法,比如学校类里面有创建讲师.创建班级-- 3.根据下面写出大致的代码,并实现其功能 遇到的困 ...
- 第一章-第六题(帮人抢票,帮人选课这些软件是否合法 你怎么看?)--By梁旭晖
我觉得这些软件是合法的,符合道德规范的. 计算机当初设计的初衷就是简化甚至替代人类的工作.而软件作为计算机硬件的驱动着,其设计就是体现这些原则. 现在互联网上的订票,选课类型的网站还是有很多的,比如: ...
- Python开发程序:选课系统-改良版
程序名称: 选课系统 角色:学校.学员.课程.讲师要求:1. 创建北京.上海 2 所学校2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开3. ...
- SQL Server 【附】创建"商品管理数据库"、"学生选课数据库"的SQL语句
附:(创建“商品管理数据库”的SQL语句) --建立"商品管理数据库"数据库-- create database 商品管理数据库 on(name='商品管理数据库_m', file ...
- BFS、DFS与选课问题(拓扑排序)
1选课问题 Leetcode上有这样一道题:有代号0,1,2……n-1的n门课程.其中选择某些课程需要另一些课程作为前提条件.用一组pair来表示这些条件:[1,0],[1,2],表示如果要选修课程1 ...
随机推荐
- Oracle_安装说明
1.先到Oracle官网上下载11g oracle Database 11g 第 2 版 (11.2.0.1.0) 标准版.标准版 1 以及企业版 适用于 Microsoft Windows (x64 ...
- EF5.0区别于EF4.0的crud区别
public T AddEntity(T entity) { //EF4.0的写法 添加实体 //db.CreateObjectSet<T>().AddObject(entity); // ...
- python基础学习笔记(一)
安装与运行交互式解释器 在绝大多数linux和 UNIX系统安装中(包括Mac OS X),Python的解释器就已经存在了.我们可以在提示符下输入python命令进行验证(作者环境ubuntu) f ...
- L2-027. 名人堂与代金券
链接:名人堂与代金券 在比赛中这题只得了2分,赛后发现原来strcmp函数并不是只返回-1,0,1三种,而是返回正数负数0 但是在我的电脑上一般就是返回前三种,只是用后面的三种更稳妥点 都怪我基础不扎 ...
- js格式化时间
转自:https://blog.csdn.net/u010964869/article/details/51095827 显示格式为:yyyy-mm-dd hh:mi:ss function form ...
- 业务-----部门Service常用逻辑
1.org实体类 public class Org implements Serializable { private static final long serialVersionUID = 1L; ...
- Spring事务银行转账示例
https://www.imooc.com/video/9331 声明式事务 @Transactiona() 编程式事务 非模板式(不使用TransactionTemplate) http://cai ...
- Navicat连接mysql备份数据库提示:1577 – Cannot proceed because system tables used by Event Scheduler where found damaged at server start
解决办法,可以参考试试: http://www.cnblogs.com/huangcong/p/3389010.html http://blog.csdn.net/phpfenghuo/article ...
- C++ 类的静态成员变量及静态成员函数
ps:下面所说 成员=成员变量+成员函数: 作用 由于对象与对象之间的成员变量是相互独立的.所以要想共用数据,则需要使用静态成员和静态函数. 空间分配 静态成员是在程序编译时分配空间,而在程序结束时释 ...
- SAP PA认证
----------------------------------------------------------------转帖---------------------------------- ...