zoukankan      html  css  js  c++  java
  • HDU 1561

    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
    ",dp[0][m+1]);
    59     }
    60     return 0;
    61 }
  • 相关阅读:
    python isinstance函数 判断元素是否是字符串、int型、float型
    Day04 list(列表)
    Day 05 Dict字典
    Python的简介
    DAY7 字符编码和文件操作
    DAY6 元组、字典与集合
    DAY5 基本数据类型及内置方法
    DAY4 if、while和for
    DAY3 数据类型与运算符
    DAY2 初识python
  • 原文地址:https://www.cnblogs.com/codeyuan/p/4307758.html
Copyright © 2011-2022 走看看