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

HDU 1561

时间:2015-03-01 23:39:29      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:

The more, The Better

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


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

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<algorithm>
 6 #include<vector>
 7 using namespace std;
 8 
 9 const int maxn=205;
10 int n,m;
11 bool visit[maxn];
12 int value[maxn];
13 int dp[maxn][maxn],dp0[maxn][maxn];
14 vector<int> G[maxn];
15 
16 void dfs(int t)
17 {
18     if(visit[t]) return ;
19     visit[t]=1;
20     dp0[t][0]=0;
21     int num=G[t].size();
22     for(int i=0;i<num;i++)//t的第i个儿子
23     {
24         int son=G[t][i];
25         for(int j=m;j>=0;j--)//在i这个子树中选出j个
26             for(int k=0;j+k<=m;k++)
27             {
28                 if(dp0[t][j]!=-1){
29                     if(!visit[son]) dfs(son);
30                     int a=dp[son][k];
31                     dp0[t][j+k]=max(dp0[t][j+k],dp0[t][j]+a);
32                 }
33             }
34     }
35      for(int i=0;i<=m;i++)
36          if(dp0[t][i]!=-1) dp[t][i+1]=dp0[t][i]+value[t];
37 }
38 int main()
39 {
40   //  freopen("in.txt","r",stdin);
41     int a,b;
42     while(1){
43         scanf("%d%d",&n,&m);
44         memset(dp,-1,sizeof(dp));
45         memset(dp0,-1,sizeof(dp0));
46         //printf("%d ",dp[0][0]);
47         memset(visit,0,sizeof(visit));
48         memset(value,0,sizeof(value));
49         if(!n&&!m) break;
50         for(int i=0;i<maxn;i++) G[i].clear();
51         for(int i=1;i<=n;i++)
52         {
53             scanf("%d%d",&a,&b);
54             G[a].push_back(i);
55             value[i]=b;
56         }
57         dfs(0);
58         printf("%d\n",dp[0][m+1]);
59     }
60     return 0;
61 }

 

HDU 1561

标签:

原文地址:http://www.cnblogs.com/codeyuan/p/4307758.html

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