zoukankan      html  css  js  c++  java
  • HDU 1561 The more, The Better(树形DP+01背包)

    The more, The Better

    Time Limit : 6000/2000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
    Total Submission(s) : 33   Accepted Submission(s) : 25

    Font: Times New Roman | Verdana | Georgia

    Font Size: ← →

    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

    HDU 2006-12 Programming Contest
     
    #include <iostream>
    #include<cstdio>
    #include<algorithm>
    #include<vector>
    #include<cstring>
    using namespace std;
    int n,m;
    vector<int> mp[205];
    int dp[205][205];
    
    void dfs(int u)
    {
        for(int i=0;i<mp[u].size();i++)
        {
            int son=mp[u][i];
            dfs(son);
            for(int j=m;j>1;j--)
                for(int k=1;k<j;k++)
                   dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[son][k]);
        }
    }
    int main()
    {
        while(~scanf("%d%d",&n,&m))
        {
            if(n==0 && m==0)break;
            m++;//多了一个0点
            for(int i=0;i<=n;i++) mp[i].clear();
            memset(dp,0,sizeof(dp));
            for(int i=1;i<=n;i++)
            {
                int a,b;
                scanf("%d%d",&a,&b);
                mp[a].push_back(i);//用0为根把所有点串联起来
                for(int j=1;j<=m;j++) dp[i][j]=b;
            }
            dfs(0);
           printf("%d
    ",dp[0][m]);
        }
    
        return 0;
    }
  • 相关阅读:
    [C#] override和overload的区别
    [ASP.Net] 20141228_Dapper文章搜集
    JSP
    Ajax使用简介
    编写JAVA脚本的JSP页面
    JAVA web开发模式
    JSP基础
    过滤器
    监听会话范围内事件
    http解析
  • 原文地址:https://www.cnblogs.com/stepping/p/6391519.html
Copyright © 2011-2022 走看看