博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[codevs1378]选课
阅读量:5890 次
发布时间:2019-06-19

本文共 1221 字,大约阅读时间需要 4 分钟。

对于具有树形依赖关系的背包问题,我们可以把每棵子树看作是一个泛化物品,那么一棵子树的泛化物品就是子树根节点的这件物品的泛化物品与由根所连的所有子树的泛化物品的和。

整个动规过程就是从叶子进行到根。

1 #include
2 #include
3 #include
4 #define max(a, b) ((a) > (b) ? (a) : (b)) 5 using namespace std; 6 7 inline void read(int &ans) { 8 static char ch = getchar(); 9 register int neg = 1;10 ans = 0;11 for (; !isdigit(ch); ch = getchar())12 if (ch == '-') neg = -1;13 for (; isdigit(ch); ch = getchar())14 ans = ans * 10 + ch - '0';15 ans *= neg;16 }17 18 const int N = 310;19 int n, m;20 vector < int > g[N];21 int w[N], f[N][N];22 23 void dfs(int u, int c) {24 if (c <= 0) return;25 for (int i = 0; i < g[u].size(); ++i) {26 int &v = g[u][i];27 for (int j = 0; j < c; ++j) f[v][j] = f[u][j] + w[v];28 dfs(v, c - 1);29 for (int j = 1; j <= c; ++j)30 f[u][j] = max(f[u][j], f[v][j - 1]);31 }32 }33 34 int main() {35 read(n); read(m);36 for (int u, i = 1; i <= n; ++i) read(u), g[u].push_back(i), read(w[i]);37 dfs(0, m);38 printf("%d\n", f[0][m]);39 return 0;40 }
View Code

 

题解见徐持衡《浅谈几类背包问题》

转载于:https://www.cnblogs.com/p0ny/p/6785528.html

你可能感兴趣的文章
Linux设备驱动之semaphore机制【转】
查看>>
每天一个linux命令(25):linux文件属性详解
查看>>
【android】getDimension()、getDimensionPixelOffset()和getDimensionPixelSize()区别详解
查看>>
HDU 3280 Equal Sum Partitions(二分查找)
查看>>
第一个之出现一次的字符
查看>>
go微服务框架go-micro深度学习(三) Registry服务的注册和发现
查看>>
expectFAQ(附一个python批量任务脚本)--持续更新
查看>>
HDU 2492 Ping pong
查看>>
JPA的Embeddable注解
查看>>
Maven在Eclipse中的实用小技巧
查看>>
步步为营Hibernate全攻略(一)构建Hibernate框架环境
查看>>
【开放源代码】【谐波数据生成器】【上位机软件】(版本:0.00)
查看>>
Hibernate基础-HelloWord
查看>>
Android Studio系列教程四--Gradle基础
查看>>
添加cordova-plugin-file-opener2后,打包出错
查看>>
python 重载方法有哪些特点 - 老王python - 博客园
查看>>
在Fedora8上安装MySQL5.0.45的过程
查看>>
TCP长连接与短连接的区别
查看>>
设计模式之命令模式
查看>>
android 测试 mondey
查看>>