【树上背包】洛谷P2014 [CTSC1997] 选课
【树上背包】洛谷P2014 [CTSC1997] 选课
题目链接:[P2014 CTSC1997] 选课 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目描述
在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习。现在有
题解
简单的树上背包模板题,定义
代码
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
cin >> n >> m;
vector<int> s(n + 1);
vector<vector<int>> adj(n + 1);
for (int i = 1; i <= n; i++) {
int pa;
cin >> pa >> s[i];
adj[pa].push_back(i);
}
auto dfs = [&](auto self, int u) -> vector<int> {
vector<int> ans(2);
ans[1] = s[u];
for (auto v : adj[u]) {
vector<int> f = self(self, v);
int n1 = ans.size(), n2 = f.size();
ans.resize(ans.size() + f.size());
for (int i = n1 - 1; i >= 1; i--) { // 从大到小,避免重复取;i不能等于0,因为当前节点u必须要选。
for (int j = 0; j < n2; j++) {
ans[i + j] = max(ans[i + j], ans[i] + f[j]);
}
}
}
return ans;
};
auto dp = dfs(dfs, 0);
cout << dp[m + 1] << '\n'; // 因为把0点也加入其中了,所以是最终选了m + 1门课
return 0;
}
本文作者:blockche
本文链接:https://www.cnblogs.com/blockche/p/17608662.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
分类:
,
,
标签:
,
,
,
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步