背包类树形DP 选课题解
题目传送门;
我觉得题目给出0节点作为虚拟课程,也避免了我们要去想将若干个森林建成一棵树;将N个节点的森林建成了N+1条边的树;
其次,我们对这个题进行一个分析;
很容易想到F【x,t】表示以x为根的子树中,选择t门课程所获得得最高学分;
在x的子树中选择节点y,再以y为根的子树中,选择c_i门课程,保证Σc_i = t - 1;
初始状态,t=0时,F【x,t】=0;
通过分析状态转移方程,该方程实际上是一个分组背包模型,第i组的第j个物品体积为j,价值为F[y,j],背包总容积t-1;
我们要从每组中选择不超过1个物品(每个子节点y都只能选择一个状态转移到x),在选择总物品不超过t-1的前提下,学分最大;
是背包与树形DP的结合;
#include<bits/stdc++.h> using namespace std; int lin[1000],tot,n,m,x,f[400][400],s[400]; template<typename T>inline void read(T &x) {x=0;T f=1,ch=getchar();while(!isdigit(ch)) {if(ch=='-') f=-1; ch=getchar();}while(isdigit(ch)) {x=x*10+ch-'0'; ch=getchar();}x*=f; } struct gg {int y,next; }a[2000]; inline void add(int x,int y) {a[++tot].y=y;a[tot].next=lin[x];lin[x]=tot; } inline void dp(int x) {f[x][0]=0;for(int i=lin[x];i;i=a[i].next) {int y=a[i].y;dp(y);//倒序循环当前选课总门数,或者背包的总体积; for(int t=m;t>=0;--t) {//循环更深子树上的选课门数(组内物品);//此处倒序是为了正确处理组内体积为0的物品,这样可以从初始状态f【x,0】转移;for(int j=t;j>=0;--j) {if(t-j>=0) {f[x][t]=max(f[x][t],f[x][t-j]+f[y][j]);}}}}if(x!=0) {//x!=0,选修x本身需要占用1节课,获得相应的学分; for(int t=m;t>0;t--) f[x][t]=f[x][t-1]+s[x];} } int main() {read(n);read(m);for(int i=1;i<=n;i++) {read(x);add(x,i);read(s[i]);}dp(0);cout<<f[0][m]<<endl;return 0; }
转载于:https://www.cnblogs.com/Tyouchie/p/10830072.html
背包类树形DP 选课题解相关推荐
- POJ3345 Bribing FIPA 【背包类树形dp】
题目链接 POJ 题解 背包树形dp板题 就是读入有点无聊,浪费了很多青春 #include<iostream> #include<cstdio> #include<cm ...
- 树形dp瞎讲+树形dp基础题题解
---恢复内容开始--- 没错 咕了这么久(没有青青姐久 我又开始写博客了( ´▽`) 想了很久些什么(才没有想过呢 虽然被鄙视基础不好但还是走上了树形dp的不归路 那么 就来写写树形dp吧(dtx ...
- BZOJ 2133 切割(树形DP,树上背包)大概是本题全网第一篇题解 >_<【BZOJ 修复工程】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 BZOJ 2133 切割这道题全网搜不到任何一篇题解 >_< 看评测记录也没有几个人AC- ...
- 【牛客每日一题】4.15 Treepath 题解(树上dfs/树形DP)
题目链接:https://ac.nowcoder.com/acm/problem/14248 来源:牛客网 题目描述 给定一棵n个点的树,问其中有多少条长度为偶数的路径.路径的长度为经过的边的条数.x ...
- PAT甲级1106 Lowest Price in Supply Chain:[C++题解]树、结点到根结点的距离、树形dp、记忆化搜索
文章目录 题目分析 题目链接 题目分析 来源:acwing 分析:这道题是第三次做了. 和PAT甲级1079 Total Sales of Supply Chain:[C++题解] 树.结点到根结点的 ...
- PAT甲级1090 Highest Price in Supply Chain:[C++题解]树、结点到根结点的距离、记忆化搜索、树形dp
文章目录 题目分析 题目链接 题目分析 来源:acwing 和PAT甲级1079 Total Sales of Supply Chain:[C++题解] 树.结点到根结点的距离.树形dp.记忆化搜索是 ...
- 选课_ctsc1997_ssl1606_树形dp
Description 大学里实行学分.每门课程都有一定的学分,学生只要选修了这门课并考核通过就能获得相应的学分.学生最后的学分是他选修的各门课的学分的总和. 每个学生都要选择规定数量的课程.其中有些 ...
- AcWing323. 战略游戏(树形DP)题解
题目传送门 题目描述 鲍勃喜欢玩电脑游戏,特别是战略游戏,但有时他找不到解决问题的方法,这让他很伤心. 现在他有以下问题. 他必须保护一座中世纪城市,这条城市的道路构成了一棵树. 每个节点上的士兵可以 ...
- AcWing1075. 数字转换(树形DP)题解
题目传送门 如果一个数 x 的约数之和 y(不包括他本身)比他本身小,那么 x 可以变成 y,y 也可以变成 x. 例如,4 可以变为 3,1 可以变为 7. 限定所有数字变换在不超过 n 的正整数范 ...
最新文章
- 怎么添加设置微信定位服务器,微信的定位怎么添加
- 甲骨文预言机平台(3) API Gateway
- 【Android.mk】android编译系统makefile文件Android.mk的写法
- 软件质量保证计划_如何做好软件项目的质量管理?
- CV中多的空格导致报错
- Echarts地图编写
- 【POJ - 2631 】Roads in the North(树的直径)
- [leetcode]831. 隐藏个人信息
- Android 创建Mpaas项目
- 期货反跟单-镜像零滑点软件真有那么靠谱吗?
- GAN(生成对抗网络)的系统全面介绍(醍醐灌顶)
- java程序中,如何设置周一为一周的开始?如何设置周一为一周的第一天? 或者说,如何理解java的setFirstDayOfWeek()方法?
- Lowest Common Ancestor of a Binary Tree
- python中shift函数_Python numpy.left_shift函数方法的使用
- 史上最全——QQ秘籍之全攻略
- Android 短视频编辑开发之摄像头预览实时美颜(三)
- 原生js实现贪食蛇小游戏
- 如何快速实现数组/字符串的逆序(用reverse函数实现)
- 汉诺塔(河内塔)问题
- C语言编写可以实现malloc() free()功能的函数(空间/时间复杂度低)
热门文章
- ios html5 不支持 flv_iExplorer v4.2.6 一款优秀强大的 iOS 资源管理工具
- C++编程问题汇总(方便日后查阅)
- 51nod 1785 数据流中的算法 (方差计算公式)
- Shell(6)——array的删改unset
- php使mysql显示错误_如何针对依赖用户输入的长查询在PHP中显示MySQL错误?
- 张朝阳:我什么都有,但我就是很痛苦
- 解决 iOS 11 webview 顶部空白条的问题
- Windows各种提权漏洞对应的补丁号
- linux mysql操作知识--收藏
- C++ string与数值的转换