• cdoj 1136 邱老师玩游戏 树形背包


    邱老师玩游戏

    Time Limit: 20 Sec

    Memory Limit: 256 MB

    题目连接

    http://acm.uestc.edu.cn/#/problem/show/1136

    Description

    邱老师最近在玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中邱老师允许攻克M个城堡并获得里面的宝物。

    但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其他某一个特定的城堡。你能帮邱老师算出要获得尽量多的宝物应该攻克哪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

    对于每个测试实例,输出一个整数,代表邱老师攻克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

    HINT

    题意

    题解:

    树形背包,可以理解为一共有n+1个点,只有n条边,然后我们以0点为根

    跑裸的树形01背包就好了

    代码

    #include<iostream>
    #include<stdio.h>
    #include<vector>
    #include<cstring>
    using namespace std;
    
    vector<int> Q[205];
    long long dp[205][205];
    int vis[205];
    int b[205];
    int n,m;
    void dfs(int x)
    {
        if(vis[x])return;
        vis[x]=1;
        dp[x][1]=b[x];
        for(int i=0;i<Q[x].size();i++)
        {
            int v = Q[x][i];
            dfs(v);
            for(int j=m;j>=0;j--)
                for(int k=0;k<j;k++)
                    dp[x][j]=max(dp[x][j],dp[v][k]+dp[x][j-k]);
        }
    }
    int main()
    {
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            if(n==0&&m==0)break;m++;
            for(int i=0;i<=n;i++)
                Q[i].clear();
            memset(vis,0,sizeof(vis));
            memset(dp,0,sizeof(dp));
            for(int i=1;i<=n;i++)
            {
                int x;scanf("%d%d",&x,&b[i]);
                Q[x].push_back(i);
            }
            dfs(0);
            printf("%lld
    ",dp[0][m]);
        }
    }
  • 相关阅读:
    C#|.NET从控制反转(依赖注入)想到事件注入 (非AOP)
    libevent 2.1.3 for VS2008 source code
    如何进行object以及Array(数组)的深复制
    Flash ProgressEvent.bytesTotal为0的原因和解决
    Flash字体嵌入方法总结—(4)进阶篇
    mysql分组取每组前几条记录(排名) 附group by与order by的研究
    Flash游戏优化技巧
    教程:深入理解Flash的沙箱 – Application Domains
    Flash Player 11异步解码Bitmap
    常用公式
  • 原文地址:https://www.cnblogs.com/qscqesze/p/4971434.html
Copyright © 2020-2023  润新知