P2014
题意
- 从一棵树中选择m条与根节点直接/间接相连的点,使得总权值最大
DP(树上背包)
状态: 表示在以为根的子树中,选择了个点的权值最大值
转移
决策:
细节
- 时没有父亲->把0作为根节点,从开始DFS
- 因为多加了一个节点,所以边数要
代码
| #include <bits/stdc++.h> |
| using namespace std; |
| int n,m; |
| int dp[310][310]; |
| int s,k; |
| struct edge{ |
| int to,next; |
| }edge[310]; |
| int head[310],cnt; |
| void insert(int from,int to){ |
| edge[++cnt].to=to; |
| edge[cnt].next=head[from]; |
| head[from]=cnt; |
| } |
| void DFS(int x){ |
| for(int i=head[x];i;i=edge[i].next){ |
| int to=edge[i].to; |
| DFS(to); |
| |
| for(int j=m;j>0;j--){ |
| for(int k=0;k<j;k++){ |
| dp[x][j]=max(dp[x][j],dp[x][j-k]+dp[to][k]); |
| } |
| } |
| } |
| } |
| int main(){ |
| |
| cin>>n>>m; |
| m++; |
| for(int i=1;i<=n;i++){ |
| cin>>s>>dp[i][1]; |
| insert(s,i); |
| } |
| DFS(0); |
| cout<<dp[0][m]<<"\n"; |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话