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;
}


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

相关文章推荐

HDU 1011 Starship Troopers(树状背包dp)

首先说一下树状dp的思路,根据题意构建一棵有根树,利用dfs沿着根结点下去直到叶子结点,然后回溯,当前结点就由孩子结点推出来(状态转移方程)。 题意:给你n个山洞m个士兵,每个山洞有x个bug和y能...

hdu1011(背包树形DP)

没有完全理解这题,

hdu 1011 tree dp+背包 有trick

刚开始我以为是比较熟悉的树形dp+背包,但一直wa,网上的代码是非递归的,看到我头晕,看了大牛的代码后才发现有Trick...        发下代码,给有同样问题的人参考下 /* 题...

HDU 1011 Starship Troopers(树形背包)

 题意:有n个洞组成一棵树,你有m个士兵,你从1号房间开始攻打,每个洞有a个"bugs"和b的价值。你的一个士兵可以打20个"bugs",为了拿到这个洞的价值b你必须留下k个士兵消灭这个洞的所有...

hdu 1011 树型DP(依赖背包)

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

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

#include #include #include #include using namespace std; int n, m; int dp[101][101]; int used[...

hdu 1011 Starship Troopers (树形背包dp)

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

【树形DP(背包)】 HDU 1011 Starship Troopers

HDU 1011 树形背包(DP) Starship Troopers

hdu1011(树形背包)

地址:http://acm.hdu.edu.cn/showproblem.php?pid=1011 Starship Troopers Time Limit: 10000/5000 MS ...

hdu 1011 Starship Troopers 树形背包

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1011 题意:有n个洞,每个洞有若干虫子和脑子,洞之间相连形成一棵树。你有m个士兵,一个士兵可以打10...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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