题目链接: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 ;
}

最新文章

  1. python的__future__特性
  2. 【C#】第2章学习要点
  3. php SPL学习
  4. (转)C# Color类图示
  5. WWF3动态修改工作流&lt;第九篇&gt;
  6. Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步
  7. [LeetCode#84]Largest Rectangle in Histogram
  8. 我的开源框架之Accordion控件
  9. AsyncTask delay延迟执行 或者顺序执行 问题
  10. boost uuid 学习笔记
  11. python 2.7 字符串处理
  12. PTA自测-3 数组元素循环右移问题
  13. html canvas-nest.js 源码
  14. Supervised Learning and Unsupervised Learning
  15. leetcode第一刷_Populating Next Right Pointers in Each Node II
  16. python入门(14)定义函数和接收返回值
  17. JDBC编程学习笔记之数据库连接池的实现
  18. [CF1093E]Intersection of Permutations
  19. jmeter压测mysql报can not be represented as java.sql.Timestame错误解决方法
  20. leecode第一百四十八题(排序链表)

热门文章

  1. 浅谈系统架构&lt;一&gt;
  2. Mac 效率工具
  3. SVN和Git下载地址
  4. 深入理解javascript原型和闭包(5)——instanceof
  5. java 集合list遍历时删除元素
  6. Ubuntu 12.4 Apache2 安装教程
  7. PHP 连接 MySQL
  8. OC中的extern,static,const
  9. LYDSY模拟赛day1 String Master
  10. [IOS基础]关于IOS的UIScreeen,UIView,UIViewController,UIWindow理解