题目链接http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3626

题目大意:树中取点。每过一条边有一定cost,且最后要回到起点。给定预算m,问最大价值。

解题思路

首先要注意这题要回到起点,由于树的特殊结构(每个结点只有一个父亲)也就是说,要回到开头,

开销是2倍。所以首先m/=2。

然后就是树形背包的求解,这题的cost在边,所以for写法变成如下:

for(m....j....0)
     for(0....k....j-e.cost)

dp[i][j]=max(dp[i][j],dp[i][j-k-e.cost]+dp[t][k]);

for循环的主要变化是0的出现,也就是说某些点的开销可以是0(在父亲上算过了)。

所以初始化也要变成:for(int i=0;i<=m;i++) dp[root][i]=w[root];

DP方程的主要变化就是dp[i][j-k]   ->  dp[i][j-k-e.cost],这里之所以要减去e.cost,是为了防止cost的重复计算。

不妨设k=j-e.cost,你就会发现在计算dp[i][0],这也是为什么要推cost=0这个状态。

#include "cstdio"
#include "iostream"
#include "cstring"
using namespace std;
#define maxn 300
struct Edge
{
int to,next,c;
}e[maxn*];
int w[maxn],num[maxn],dp[maxn][maxn],head[maxn],tol;
int n,m,k,u,v,c;
void addedge(int u,int v,int c)
{
e[tol].to=v;
e[tol].next=head[u];
e[tol].c=c;
head[u]=tol++;
}
void dfs(int root,int pre)
{
for(int i=;i<=m;i++) dp[root][i]=w[root];
int i=root;
for(int a=head[root];a!=-;a=e[a].next)
{
int t=e[a].to;
if(t==pre) continue;
dfs(t,root);
for(int j=m;j>=;j--)
for(int k=;k<=j-e[a].c;k++)
dp[i][j]=max(dp[i][j],dp[i][j-k-e[a].c]+dp[t][k]);
}
}
int main()
{
//freopen("in.txt","r",stdin);
while(~scanf("%d",&n))
{
memset(head,-,sizeof(head));
memset(dp,,sizeof(dp));
tol=;
for(int i=;i<=n;i++)
scanf("%d",&w[i]);
for(int i=;i<n;i++)
{
scanf("%d%d%d",&u,&v,&c);
addedge(u,v,c);
addedge(v,u,c);
}
scanf("%d%d",&k,&m);
m/=;
dfs(k,k);
printf("%d\n",dp[k][m]);
}
}
2875311 neopenx ZOJ 3626 Accepted 636 0 C++ (g++ 4.4.5) 1174
2014-10-22 09:13:13

ZOJ 3626(树形DP+背包+边cost)的更多相关文章

  1. ZOJ 3201 树形dp+背包(简单题)

    #include<cstdio> #include<vector> #include<cstring> #include<iostream> using ...

  2. URAL_1018 Binary Apple Tree 树形DP+背包

    这个题目给定一棵树,以及树的每个树枝的苹果数量,要求在保留K个树枝的情况下最多能保留多少个苹果 一看就觉得是个树形DP,然后想出 dp[i][j]来表示第i个节点保留j个树枝的最大苹果数,但是在树形过 ...

  3. Vijos 1180 (树形DP+背包)

    题目链接: https://vijos.org/p/1180 题目大意:选课.只有根课选了才能选子课,给定选课数m, 问最大学分多少. 解题思路: 树形背包.cost=1. 且有个虚根0,取这个虚根也 ...

  4. BZOJ.1017.[JSOI2008]魔兽地图(树形DP 背包DP)

    题目链接 树形DP,考虑子节点对父节点的贡献. 设f[x][i][j]表示当前为x,用i个x去合成上一层装备,花费为j的最大价值. 由子节点转移时 是一个分组背包,需要一个辅助数组g[i][j]表示前 ...

  5. hdu1561 The more, The Better (树形dp+背包)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1561 思路:树形dp+01背包 //看注释可以懂 用vector建树更简单. 代码: #i ...

  6. 【BZOJ-1017】魔兽地图DotR 树形DP + 背包

    1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1566  Solved: 705[Submit][S ...

  7. codeforces 212E IT Restaurants(树形dp+背包思想)

    题目链接:http://codeforces.com/problemset/problem/212/E 题目大意:给你一个无向树,现在用两种颜色去给这颗树上的节点染色.用(a,b)表示两种颜色分别染的 ...

  8. 树形DP+背包(poj1155泛化分组背包)

    TELE Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3675   Accepted: 1936 Description ...

  9. joyOI 选课 【树形dp + 背包dp】

    题目链接 选课 题解 基础背包树形dp #include<iostream> #include<cstdio> #include<cmath> #include&l ...

随机推荐

  1. hMailServer+foxmail配置局域网邮件服务器

    1.下载hMailServer并安装,请参考以下网址 https://www.hmailserver.org 2.安装foxmail,官网如下: http://www.foxmail.com/ 3.配 ...

  2. Coursera台大机器学习技法课程笔记02-Dual Support Vector Machine

    这节课讲的是SVM的对偶问题,比较精彩的部分:为何要使用拉格朗日乘子以及如何进行对偶变换. 参考:http://www.cnblogs.com/bourneli/p/4199990.html http ...

  3. 自编译ngrok服务器

    转载:http://www.haiyun.me/archives/1012.html 首先安装GO环境,http://www.haiyun.me/archives/1009.html 1 2 3 4 ...

  4. 如何在Linux上实现文件系统的自动检查和修复?

    Linux文件系统有可能在各种各样的情况下受到损坏,比如系统崩溃.突然断电.磁盘断开,或者文件节点 (i-node)不小心被覆盖等等,因此需要定期检查文件系统,而说到检查和修复Linux文件系统,fs ...

  5. linux 下如何查看和踢除正在登陆的其它用户 ==>Linux下用于查看系统当前登录用户信息的4种方法

    在linux系统中用pkill命令踢出在线登录用户 由于linux服务器允许多用户登录,公司很多人知道密码,工作造成一定的障碍 所以需要有时踢出指定的用户 1/#who   查出当前有那些终端登录(用 ...

  6. 【leetcode】Excel Sheet Column Number

    Excel Sheet Column Number Related to question Excel Sheet Column Title Given a column title as appea ...

  7. Codeforces 389A (最大公约数)

    Fox and Number Game Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u ...

  8. 网络流-最大流 模板(poj 1273)

    #include<cstdio> #include<iostream> #include<cstring> #include<queue> #defin ...

  9. android 输入法出现挤压屏幕、android输入键盘覆盖了屏幕控件的解决办法

    如果希望输入法键盘弹出时不自动向上挤压activity,在Manifest清单文件中对应的activty中设置属性android:windowSoftInputMode="adjustPan ...

  10. 类似于fopen与fopen64的种种情况

    在Linux和unix系统中,我们会遇到¥和¥64的情况.比如stat64,fopen64等 fopen64是linux特有 的,fopen64()函数和fopen()函数相同的,只是底层的文件描述符 ...