题目传送门;

我觉得题目给出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 选课题解相关推荐

  1. POJ3345 Bribing FIPA 【背包类树形dp】

    题目链接 POJ 题解 背包树形dp板题 就是读入有点无聊,浪费了很多青春 #include<iostream> #include<cstdio> #include<cm ...

  2. 树形dp瞎讲+树形dp基础题题解

    ---恢复内容开始--- 没错 咕了这么久(没有青青姐久 我又开始写博客了( ´▽`) 想了很久些什么(才没有想过呢 虽然被鄙视基础不好但还是走上了树形dp的不归路 那么 就来写写树形dp吧(dtx ...

  3. BZOJ 2133 切割(树形DP,树上背包)大概是本题全网第一篇题解 >_<【BZOJ 修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 BZOJ 2133 切割这道题全网搜不到任何一篇题解 >_< 看评测记录也没有几个人AC- ...

  4. 【牛客每日一题】4.15 Treepath 题解(树上dfs/树形DP)

    题目链接:https://ac.nowcoder.com/acm/problem/14248 来源:牛客网 题目描述 给定一棵n个点的树,问其中有多少条长度为偶数的路径.路径的长度为经过的边的条数.x ...

  5. PAT甲级1106 Lowest Price in Supply Chain:[C++题解]树、结点到根结点的距离、树形dp、记忆化搜索

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析:这道题是第三次做了. 和PAT甲级1079 Total Sales of Supply Chain:[C++题解] 树.结点到根结点的 ...

  6. PAT甲级1090 Highest Price in Supply Chain:[C++题解]树、结点到根结点的距离、记忆化搜索、树形dp

    文章目录 题目分析 题目链接 题目分析 来源:acwing 和PAT甲级1079 Total Sales of Supply Chain:[C++题解] 树.结点到根结点的距离.树形dp.记忆化搜索是 ...

  7. 选课_ctsc1997_ssl1606_树形dp

    Description 大学里实行学分.每门课程都有一定的学分,学生只要选修了这门课并考核通过就能获得相应的学分.学生最后的学分是他选修的各门课的学分的总和. 每个学生都要选择规定数量的课程.其中有些 ...

  8. AcWing323. 战略游戏(树形DP)题解

    题目传送门 题目描述 鲍勃喜欢玩电脑游戏,特别是战略游戏,但有时他找不到解决问题的方法,这让他很伤心. 现在他有以下问题. 他必须保护一座中世纪城市,这条城市的道路构成了一棵树. 每个节点上的士兵可以 ...

  9. AcWing1075. 数字转换(树形DP)题解

    题目传送门 如果一个数 x 的约数之和 y(不包括他本身)比他本身小,那么 x 可以变成 y,y 也可以变成 x. 例如,4 可以变为 3,1 可以变为 7. 限定所有数字变换在不超过 n 的正整数范 ...

最新文章

  1. 怎么添加设置微信定位服务器,微信的定位怎么添加
  2. 甲骨文预言机平台(3) API Gateway
  3. 【Android.mk】android编译系统makefile文件Android.mk的写法
  4. 软件质量保证计划_如何做好软件项目的质量管理?
  5. CV中多的空格导致报错
  6. Echarts地图编写
  7. 【POJ - 2631 】Roads in the North(树的直径)
  8. [leetcode]831. 隐藏个人信息
  9. Android 创建Mpaas项目
  10. 期货反跟单-镜像零滑点软件真有那么靠谱吗?
  11. GAN(生成对抗网络)的系统全面介绍(醍醐灌顶)
  12. java程序中,如何设置周一为一周的开始?如何设置周一为一周的第一天? 或者说,如何理解java的setFirstDayOfWeek()方法?
  13. Lowest Common Ancestor of a Binary Tree
  14. python中shift函数_Python numpy.left_shift函数方法的使用
  15. 史上最全——QQ秘籍之全攻略
  16. Android 短视频编辑开发之摄像头预览实时美颜(三)
  17. 原生js实现贪食蛇小游戏
  18. 如何快速实现数组/字符串的逆序(用reverse函数实现)
  19. 汉诺塔(河内塔)问题
  20. C语言编写可以实现malloc() free()功能的函数(空间/时间复杂度低)

热门文章

  1. ios html5 不支持 flv_iExplorer v4.2.6 一款优秀强大的 iOS 资源管理工具
  2. C++编程问题汇总(方便日后查阅)
  3. 51nod 1785 数据流中的算法 (方差计算公式)
  4. Shell(6)——array的删改unset
  5. php使mysql显示错误_如何针对依赖用户输入的长查询在PHP中显示MySQL错误?
  6. 张朝阳:我什么都有,但我就是很痛苦
  7. 解决 iOS 11 webview 顶部空白条的问题
  8. Windows各种提权漏洞对应的补丁号
  9. linux mysql操作知识--收藏
  10. C++ string与数值的转换