HDU 1011 (树背包)

原创 2015年11月18日 16:19:06

坑点是特判。

#include <bits/stdc++.h>
using namespace std;
#define maxn 111
#define maxm 222

struct node {
    int from, to, next;
}edge[maxm];
int bug[maxn], brain[maxn];
int n, m, head[maxn];
int ans;
int dp[maxn][maxn];
int degree[maxn];

void add_edge (int from, int to, int i) {
    node &e = edge[i];
    e.from = from, e.to = to, e.next = head[from], head[from] = i;
}

void dfs (int u, int fa) {
    for (int i = bug[u]; i <= m; i++) {
        dp[u][i] = brain[u];
    }
    for (int i = head[u]; i != -1; i = edge[i].next) {
        int v = edge[i].to;
        if (v == fa)
            continue;
        dfs (v, u);
        for (int j = m; j >= bug[u]; j--) {
            for (int k = 1; j+k <= m; k++) {
                dp[u][j+k] = max (dp[u][j+k], dp[u][j]+dp[v][k]);
            }
        }
    }
}

int main () {
    //freopen ("in", "r", stdin);
    while (cin >> n >> m) {
        if (n == -1 && m == -1)
            break;
        for (int i = 1; i <= n; i++) {
            cin >> bug[i] >> brain[i];
            bug[i] = ceil (bug[i]*1.0/20);
        }
        memset (head, -1, sizeof head);
        int u, v;
        int cnt = 0;
        memset (degree, 0, sizeof degree);
        for (int i = 1; i < n; i++) {
            cin >> u >> v;
            add_edge (u, v, cnt++);
            add_edge (v, u, cnt++);
            degree[u]++;
            degree[v]++;
        }
        if (m == 0) {
            printf ("0\n");
            continue;
        }
        for (int i = 2; i <= n; i++)
            if (degree[i] == 1)
                bug[i] = max (1, bug[i]); //如果是叶子节点 至少需要一个士兵
        memset (dp, 0, sizeof dp);
        dfs (1, 0);
        printf ("%d\n", dp[1][m]);
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

[ACM] hdu 1864 最大报销额(01背包或贪心)

最大报销额 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su...
  • sr19930829
  • sr19930829
  • 2014年04月06日 23:05
  • 1337

hdu 4276 树形背包

The Ghost Blows Light Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O...
  • u012358934
  • u012358934
  • 2014年02月06日 23:19
  • 1076

hdu 3033 I love sneakers!(分组背包,每组至少取一件)

http://acm.hdu.edu.cn/showproblem.php?pid=3033 大致题意:某人要买鞋子,有k种鞋,要求每种鞋至少买一双,给出每双鞋子的花费和价值,问m元钱可以买到的鞋子的...
  • u013081425
  • u013081425
  • 2014年05月04日 20:34
  • 1102

树形DP +01背包(HDU 1011)

题意:有n个房间,有n-1条道路连接着n个房间,每个房间都有若干个野怪和一定的能量值,有m个士兵从1房间入口进去,到达每个房间必须要留下若干士兵杀死所有的野怪,然后其他人继续走,(一个士兵可以杀死20...
  • u012859437
  • u012859437
  • 2014年11月14日 20:22
  • 710

hdu 1011 树型DP(依赖背包)

题意:你作为星河站队的leader,手下有m个trooper;现在让你去攻占一个基地:有n个洞穴组成,入口是洞穴1,洞穴之间用n-1条边链接,每个洞穴里面包括x个bugs,和他们的brains,你的每...
  • jiang199235jiangJJ
  • jiang199235jiangJJ
  • 2012年07月20日 10:53
  • 748

hdu 1011 Starship Troopers (树形背包dp)

题意 有n个洞穴编号为1~n,洞穴间有通道,形成了一个n-1条边的树, 洞穴的入口即根节点是1。 每个洞穴有x只bugs,并有价值y的金子,全部消灭完一个洞穴的虫子,就可以获得这个洞穴的y个金子. ...
  • shuangde800
  • shuangde800
  • 2013年08月20日 00:11
  • 2702

树形dp ( vector dfs 01背包 ) hdu 1011 Starship Troopers

#include #include #include #include using namespace std; int n, m; int dp[101][101]; int used[...
  • u013934593
  • u013934593
  • 2014年10月04日 22:30
  • 390

hdu1011(背包树形DP)

没有完全理解这题,
  • u013509299
  • u013509299
  • 2014年07月25日 09:44
  • 367

hdu 1011 树形dp 背包

题意: 给定n和m,n为节点数,m为你拥有的士兵数,每个士兵可以消灭20个bug,每个节点有bug和values,消灭bug获得该节点的values 获得 v  节点的values 必须先消...
  • chl_3205
  • chl_3205
  • 2013年07月13日 18:34
  • 430

HDU 1011 Starship Troopers(树状背包dp)

首先说一下树状dp的思路,根据题意构建一棵有根树,利用dfs沿着根结点下去直到叶子结点,然后回溯,当前结点就由孩子结点推出来(状态转移方程)。 题意:给你n个山洞m个士兵,每个山洞有x个bug和y能...
  • lihaijie_naive
  • lihaijie_naive
  • 2017年01月18日 10:59
  • 140
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU 1011 (树背包)
举报原因:
原因补充:

(最多只允许输入30个字)