题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1561

思路:

典型的树形背包题目:

定义dp[i][j]表示以i为根节点,攻打j个城堡的获得的财宝的最优值,那么dp[i][j]=max(dp[i][j],dp[son][k]+dp[i][j-k]) 其中son为i的儿子

然后从叶子节点往上进行背包即可

刚接触的同学会有疑问:就是不知道怎样将题目中的数据建为一个树,其实很简单,只要把0作为根结点即可 0节点的value初始化为0

然后dp[0][m+1]即为求得的答案,是不是很简单啊。。。。

注意初始化。

代码如下:

 #include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
#define MAX 210
int dp[MAX][MAX];
vector<int>v[MAX];
int vis[MAX];
int m,n;
void init()
{
memset(dp,-,sizeof(dp));
memset(vis,,sizeof(vis));
for(int i=;i<MAX;i++) v[i].clear();
}
void dfs(int root)
{
vis[root]=;
for(int i=;i<v[root].size();i++)
{
if(vis[v[root][i]]) continue;
int son=v[root][i];
dfs(son); for(int i=m;i>=;i--)
for(int j=;j<i;j++)
if(dp[root][i-j]!=-&&dp[son][j]!=-)
dp[root][i]=max(dp[root][i],dp[son][j]+dp[root][i-j]);
} }
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
init();
if(n==&&m==) break;
for(int i=;i<=n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
v[a].push_back(i);
dp[i][]=b;
dp[i][]=;
}
m++;
dp[][]=;
dp[][]=;
dfs();
cout<<dp[][m]<<endl;
}
return ;
}

最新文章

  1. Redis集群案例与场景分析
  2. 【centOS】账号管理
  3. 关于flume配置加载(二)
  4. codevs1004四子连棋[BFS 哈希]
  5. 【BZOJ-3638&amp;3272&amp;3267&amp;3502】k-Maximum Subsequence Sum 费用流构图 + 线段树手动增广
  6. Linux 吃掉我的内存
  7. LINUX系统下添加映射存储LUN
  8. JS基础----&gt;js中ajax的使用
  9. 【转载】使用C#进行系统编程
  10. 雷兽的数据库CAP乱谈之(一)阐述
  11. 简易的JQuery设置Cookie
  12. netstat命令[转]
  13. 怎样提交FIREDAC数据集的DELTA到中间件然后保存进数据库
  14. emulator shortcut
  15. [Qt初级] 解决 中QMainWindow和QDockWidget添加布局失败问题
  16. AR入门系列-04-vuforia识别多个图片及同屏展示
  17. C# 委托与事件详解(三)
  18. LVS-DR集群搭建
  19. RelativeLayout中include 控件覆盖重叠的问题
  20. lambda 表达式拼接

热门文章

  1. 细心!SQL语句进行运算时使用字符串时缺失精度的细节!
  2. Android应用程序更新并下载
  3. Eclipse中将含有图片资源的项目打包成jar文件
  4. 【iOS】7.4 定位服务-&gt;3.2 地图框架MapKit 功能2:路线规划(导航)
  5. 老李分享:robotium常用API 2
  6. 全栈必备 JavaScript基础
  7. js全选checkbox框
  8. 【转】DHCP的请求过程
  9. Nodejs express 获取url参数,post参数的三种方式
  10. C# CodeFirst编程模型一