经典题了,网上博客一大堆O(nCC)的做法,其实是可以将复杂度降到O(nC)的

参考依赖背包优化(泛化物品的并)

根据背包九讲,求两个泛化物品的和复杂度是O(CC)的,所以依赖背包暴力求解的复杂度是O(nCC)

然后对其进行优化,考虑 F[u][j] 用来表示以结点u为根的子树(不包括u)体积为j的全局最大价值
枚举u的儿子v,求F[v][j]数组,因为要求以v为根的子树,必须先选v,所以把v强行塞到背包里
即通过F[v][j]=F[u][j]+W[v] (j<=C-V[v])这个赋值来表示j子树的最大体积不会超过C-V[v],并且已经选了v
然后dfs求出F[v][j]的值,此时按照定义已经得到了一个新的泛化物品,即一定包含v,并且可能包含v子树元素与前面几棵子树元素的背包,
我们拿这个背包和之前的背包(即一定不包含v的子树)进行合并,去更新F[u],F[u][j]=max(F[u][j],F[v][j-V[v]])
即F[u]在体积为j的时候要么保持原来的值,不取v子树的任何物品,要么取一些v子树的物品,那么显然v物品也要被取

即每次处理完一个u的子树v后,我们就得到了一个和当前泛化物品有交集(或者说是严格的后者包含前者,因为加了一整棵v的子树(除了v没加)进去)的新的泛化背包,我们对其求并,复杂度是O(C),因为对于每个体积,我们只要求两者在该体积下的最大价值即可,当然新的泛化物品因为要强行塞入v,所以最后对应的体积也会偏移V[v]、

加深理解:一整棵子树v是如何逐步加入到决策集合中的。在dfs进入v子树后,会再遍历v的子树w,然后把w强行塞入背包,塞入背包说明前面一定会有一些物品x被挤出必选v的最佳决策集合中,那么回溯的时候我们考虑是选w还是选择x更优,最后回溯到v的时候,整个v的子树已经决策好了。

#include<bits/stdc++.h>
using namespace std;
#define N 205
struct Edge{int to,nxt,w;}e[N<<];
int head[N],tot,n,q;
void init(){memset(head,-,sizeof head);tot=;}
void add(int u,int v,int w){
e[tot].w=w;e[tot].to=v;e[tot].nxt=head[u];head[u]=tot++;
}
int F[N][N];
void dfs(int u,int pre,int C){
for(int i=head[u];i!=-;i=e[i].nxt){
int v=e[i].to;
if(v==pre)continue;
for(int j=;j<=C-;j++)
F[v][j]=F[u][j]+e[i].w;
dfs(v,u,C-);
for(int j=;j<=C;j++)
F[u][j]=max(F[u][j],F[v][j-]);
}
} int main(){
while(cin>>n>>q){
init();
for(int i=;i<n;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(v,u,w);add(u,v,w);
}
memset(F,,sizeof F);
dfs(,,q);
cout<<F[][q]<<endl;
}
}

这个题要加一个虚根,用暴力显然是过不了的。所以要优化后的依赖背包来做

#include<bits/stdc++.h>
using namespace std;
#define N 65
#define M 32005
#define ll long long
struct Edge{int to,nxt;}e[N<<];
int head[N],tot;
void init(){memset(head,-,sizeof head);tot=;}
void add(int u,int v){
e[tot].to=v;e[tot].nxt=head[u];head[u]=tot++;
} int dp[N][M],V[N],W[N],n,C;
void dfs(int u,int pre,int C){
for(int i=head[u];i!=-;i=e[i].nxt){
int v=e[i].to;
if(v==pre)continue;
for(int j=;j<=C-V[v];j++)
dp[v][j]=dp[u][j]+V[v]*W[v];
dfs(v,u,C-V[v]);
for(int j=V[v];j<=C;j++)
dp[u][j]=max(dp[u][j],dp[v][j-V[v]]);
}
} int main(){
while(cin>>C>>n){
init();
for(int i=;i<=n;i++){
int fa;
scanf("%d%d%d",&V[i],&W[i],&fa);
add(i,fa);add(fa,i);//增加一个0结点
}
memset(dp,,sizeof dp);
dfs(,,C);
int ans=;
for(int j=;j<=C;j++)ans=max(ans,dp[][j]);
cout<<ans<<endl;
}
}

依赖背包优化——ural1018,金明的预算方案的更多相关文章

  1. 有依赖的背包---P1064 金明的预算方案

    P1064 金明的预算方案 solution 1 暴搜 70pt dfs (当前搜到了第几个物品,产生的总价值,剩下多少钱) 剪枝 1:如果剩下的钱数<0,直接return就好,没必要继续了 剪 ...

  2. 「NOIP2006」「LuoguP1064」 金明的预算方案(分组背包

    题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NNN元钱就行” ...

  3. NOIP 2006 金明的预算方案(洛谷P1064,动态规划递推,01背包变形,滚动数组)

    一.题目链接:P1064 金明的预算方案 二.思路 1.一共只有五种情况 @1.不买 @2.只买主件 @3.买主件和附件1(如果不存在附件也要运算,只是这时附件的数据是0,也就是算了对标准的结果也没影 ...

  4. 背包形动态规划 fjutoj2375 金明的预算方案

    金明的预算方案 TimeLimit:1000MS  MemoryLimit:128MB 64-bit integer IO format:%lld   Problem Description 金明今天 ...

  5. tyvj 1057 金明的预算方案 背包dp

    P1057 金明的预算方案 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 NOIP2006 提高组 第二道 描述 金明今天很开心,家里购置的新房就要领钥匙了 ...

  6. Luogu 1064 金明的预算方案 / CJOJ 1352 [NOIP2006] 金明的预算方案(动态规划)

    Luogu 1064 金明的预算方案 / CJOJ 1352 [NOIP2006] 金明的预算方案(动态规划) Description 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己 ...

  7. NOIP 2006 金明的预算方案

    洛谷 P1064 金明的预算方案 https://www.luogu.org/problem/P1064 JDOJ 1420: [NOIP2006]金明的预算方案 T2 https://neooj.c ...

  8. [codevs1155][KOJ0558][COJ0178][NOIP2006]金明的预算方案

    [codevs1155][KOJ0558][COJ0178][NOIP2006]金明的预算方案 试题描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴 ...

  9. [LuoguP1064][Noip2006]金明的预算方案

    金明的预算方案(Link) 题目描述 现在有\(M\)个物品,每一个物品有一个钱数和重要度,并且有一个\(Q\),如果\(Q = 0\),那么该物件可以单独购买,当\(Q != 0\)时,表示若要购买 ...

  10. 【洛谷P1064】[NOIP2006] 金明的预算方案

    金明的预算方案 显然是个背包问题 把每个主件和它对应的附件放在一组,枚举每一组,有以下几种选法: 1.都不选 2.只选主件 3.一个主件+一个附件 4.一个主件+两个附件 于是就成了01背包.. #i ...

随机推荐

  1. 【Luogu】【关卡2-7】深度优先搜索(2017年10月)【AK】【题解没写完】

    任务说明:搜索可以穷举各种情况.很多题目都可以用搜索完成.就算不能,搜索也是骗分神器. P1219 八皇后 直接dfs.对角线怎么判断:同一条对角线的横纵坐标的和或者差相同. #include < ...

  2. asp.net网站Application_Start疑是不执行的现象

    今天遇见了一个很诡异的事情,发布了新代码后,发现在Application_Start中读取的一些配置参数变为空了,最开始我以为是什么特殊的原因程序没有执行Application_Start,导致它们的 ...

  3. ubuntu:beyond compare 4 This license key has been revoked 解决办法

    错误如图所示: 解决办法: (1)先用find命令找到bcompare所在位置:sudo find /home/ -name '*bcompare' ()进入 /home/whf/.config,删除 ...

  4. 安装express 出现 错误

    w 在网上找了很多都解决不了问题,直到换了文件新建路径就可以了 成功: 学习就是不断发现问题解决问题的过程

  5. Express post请求无法解析参数的原因

    router.post('/', function(req, res) { console.log(req.body); console.log(req.body.name); console.log ...

  6. shell编程基础干货

    变量及赋值 设置变量   A=‘china’  取消变量  unset  A    加上 export 关键字  代表全局变量 a=$(ls -l /root/bin)   ##运行里面的命令,并把结 ...

  7. springMVC配置文件 的约束

    <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...

  8. 浅析阿里云API网关的产品架构和常见应用场景

    自上世纪60年代计算机网络发展开始,API(Application Programming Interface )随之诞生,API即应用程序接口,是实现系统间衔接的桥梁.时至今日,API市场已经形成了 ...

  9. react 教程—核心概念

    react 核心概念  : https://react.docschina.org/docs/getting-started.html(官网) 或  https://www.w3cschool.cn/ ...

  10. 包管理工具(npm、yarn)

    npm包管理工具 1. npm的包安装分为本地安装(local).全局安装(global)两种,从敲的命令行来看,差别只是有没有-g而已. 2. 这两种安装方式的区别: 本地安装(安装在命令行运行所在 ...