码迷,mamicode.com
首页 > 其他好文 > 详细

hdu1561:树形背包dp

时间:2015-12-18 21:14:58      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:

给定n个地点,每个地点藏有cost[i]的宝物,取得某些宝物有时需要先取其他宝物,现在让我们选m个地点问最多可以选多少宝物?

还是挺裸的树形背包dp吧,不难,关键还是中间dp的部分。可以做模板了->_->

注意点:多组数据的话如果第一组对了然后其他都错了,那么很有可能是初始化的时候漏了。这次找可很久才知道差了e[0].clear().平时的习惯都是从1开始。

-----------------------------------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
#define rep(i,n) for(int i=1;i<=n;i++)
#define clr(x,c) memset(x,c,sizeof(x))
int read(){
 int x=0,f=1;char c=getchar();
 while(!isdigit(c)){
  if(c==‘-‘) f=-1;
  c=getchar();
 }
 while(isdigit(c)){
  x=x*10+c-‘0‘;
  c=getchar();
 }
 return x*f;
}
int sum[205],f[205][205],w[205],n,m;
vector<int>e[205];


void dfs(int x){
 sum[x]=1;
 for(int i=0;i<e[x].size();i++){
  dfs(e[x][i]);
  sum[x]+=sum[e[x][i]];
 }
 for(int i=0;i<e[x].size();i++){
  int to=e[x][i];
  for(int j=min(sum[x],m);j>=1;j--)
   for(int k=1;k<=j;k++)
       f[x][j]=max(f[x][j],f[x][j-k]+f[to][k]);
 }
 if(x) for(int i=m;i>=1;i--) f[x][i]=f[x][i-1]+w[x];
 return ;
}


int main(){
 while(scanf("%d%d",&n,&m)==2&&n&&m){
  clr(sum,0);clr(f,0);
  e[0].clear();
  rep(i,n) e[i].clear();
  rep(i,n){
   int tmp=read();w[i]=read();
   e[tmp].push_back(i);
  }
  dfs(0);
  printf("%d\n",f[0][m]);
 }
 return 0;
}

-----------------------------------------------------------------------------------------

The more, The Better

Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6647    Accepted Submission(s): 3913


Problem Description
ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物。但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其他某一个特定的城堡。你能帮ACboy算出要获得尽量多的宝物应该攻克哪M个城堡吗?
 

 

Input
每个测试实例首先包括2个整数,N,M.(1 <= M <= N <= 200);在接下来的N行里,每行包括2个整数,a,b. 在第 i 行,a 代表要攻克第 i 个城堡必须先攻克第 a 个城堡,如果 a = 0 则代表可以直接攻克第 i 个城堡。b 代表第 i 个城堡的宝物数量, b >= 0。当N = 0, M = 0输入结束。
 

 

Output
对于每个测试实例,输出一个整数,代表ACboy攻克M个城堡所获得的最多宝物的数量。
 

 

Sample Input
3 2 0 1 0 2 0 3 7 4 2 2 0 1 0 4 2 1 7 1 7 6 2 2 0 0
 

 

Sample Output
5 13
 

 

Author
8600
 

 

Source
 

hdu1561:树形背包dp

标签:

原文地址:http://www.cnblogs.com/fighting-to-the-end/p/5058151.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!