hdu1561 The more, The Better (树形dp+背包)
2024-10-20 20:40:49
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1561
思路:树形dp+01背包 //看注释可以懂
用vector建树更简单。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
#define ll long long
const int maxn=2e2+;
const int INF=0x3f3f3f3f;
///dp[i][j] 表示以i为跟节点的树,选其中的j个节点可以达到的最大值
int dp[maxn][maxn];
vector<int>v[maxn];
int N,M,x,a[maxn]; void dfs(int n,int m)
{
dp[n][]=a[n];
int len=v[n].size();
for(int i=; i<len; i++) ///01背包第一层循环
{
if(m>) dfs(v[n][i],m-);
for(int j=m-; j>=; j--) ///第二层循环,相当于背包的重量,-1的原因是根节点必选
for(int k=; k<=j; k++) ///k是在第i棵树上选K个子节点
dp[n][j+]=max(dp[n][j+],dp[n][j+-k]+dp[v[n][i]][k]);
}
} int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d%d",&N,&M) && N+M)
{
memset(dp,,sizeof(dp));
memset(a,,sizeof(a));
for(int i=; i<=N; i++) v[i].clear();
for(int i=; i<=N; i++)
{
scanf("%d%d",&x,&a[i]);
v[x].push_back(i);
}
dfs(,M+); ///0是补的根节点,M+1是可以取几个结点,因为多加了一个0结点 值为0 所以要M+1
printf("%d\n",dp[][M+]);
}
return ;
}
最新文章
- python的__future__特性
- 【C#】第2章学习要点
- php SPL学习
- (转)C# Color类图示
- WWF3动态修改工作流<;第九篇>;
- Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步
- [LeetCode#84]Largest Rectangle in Histogram
- 我的开源框架之Accordion控件
- AsyncTask delay延迟执行 或者顺序执行 问题
- boost uuid 学习笔记
- python 2.7 字符串处理
- PTA自测-3 数组元素循环右移问题
- html canvas-nest.js 源码
- Supervised Learning and Unsupervised Learning
- leetcode第一刷_Populating Next Right Pointers in Each Node II
- python入门(14)定义函数和接收返回值
- JDBC编程学习笔记之数据库连接池的实现
- [CF1093E]Intersection of Permutations
- jmeter压测mysql报can not be represented as java.sql.Timestame错误解决方法
- leecode第一百四十八题(排序链表)