首页 > 其他分享 >多重背包&树上背包小结

多重背包&树上背包小结

时间:2024-06-20 16:23:48浏览次数:15  
标签:多重 背包 二进制 然后 子树 为根 权值 小结

多重背包&树上背包

多重背包

有 \(n\) 种物品,每种物品有 \(s_i\) 个,价值为 \(v_i\) ,体积为 \(w_i\) ,背包容量为 \(V\) ,问最大价值

二进制拆分

把 \(s\) 进行二进制拆分,然后就是01背包的过程,\(O(nV\log V)\)

可以用bitset优化

单调队列

对于每个物品,先枚举\(k=0\sim w_i-1\),然后枚举余数为k的数,这个过程是 \(O(V)\) 的

然后我们发现对于一个k,进行的是内部转移,于是就维护一个单调队列即可

时间复杂度 \(O(nV)\)

CF1856E2 PermuTree (hard version)

题目描述

给定一棵以 \(1\) 为根的有根树,你需要给出一个 \(1\) 到 \(n\) 的排列 \(a\),最大化二元组 \((u,v)\) 的数量,满足 \(a_u < a_{\rm {lca(u,v)}} < a_v\),输出这个最大值。(\(2 \leq n \leq 10^6\))

solution

可以考虑在lca处算答案,然后贪心,把儿子分成两个尽量相等的部分

于是就对儿子的子树大小进行背包,\(O(n^2)\)

然后我们发现因为一次计算的子树大小和为n,那么最多有 \(\sqrt n\) 种值,然后跑多重背包即可

注意,如果用二进制拆分,其实也没有log,但是有一个实现细节:我们把进行二进制拆分后的01物品放进桶里,然后一个桶里若有超过两个,就可以等价于二进制的进位,可以证明是物品时 \(\sqrt n\) 级别的。

然后还有个细节,用bitset要动态定义长度,所以可能需要手打

树上背包

树形背包总结 - lnzwz - 博客园 (cnblogs.com)

2023.10.11联考T4

题目描述

给定一棵 \(n\)个节点、以 \(1\) 为根的树。对于每一条边,可以选择保留或不保留。
定义一个方案的权值是:只看保留的边时,形成的各个连通块大小之积的 \(k\) 次方。试计算\(2^{n-1}\) 种方案的权值之和。

solution

计数好题

首先考虑暴力,设\(g_{i,j}\)表示以i为根的子树,i所在的联通块大小为j的代价,j=0时表示断掉i的父亲那条边,然后为了方便转移,我们i所在连通块的代价先不算,每次更新完一棵子树,再进行更新\(g_{i,0}+=\sum g_{i,j}\times j^k\)

然后我们发现可以背包转移,时空复杂度\(O(n^2)\)

想到这里发现根本无法优化,于是就需要一点经验,发现\(k\le100\)

设\(f_{i,j}=\sum_{s=0}^{siz_i}(^s_j)f_{i,s}\),就是以i为根的子树,i所在的联通块贡献\((^s_j)\)的代价,我们发现,j的范围被缩减成k,然后根据第二类斯特林数的公式(普通幂转下降幂),\(s^k=\sum_{i=1}^ks2(k,i)i!(^s_i)\),然后令\(ans_i\)为该点断掉父亲的答案,\(ans_i=\sum_{j=1}^ks2(k,j)j!f_{i,j}\)

发现了可以计算答案,那么如何转移呢?

考虑状态的组合意义,在连通块中取了j个点,由于子树中的情况互不影响,可以用乘法原理,于是又可以背包转移,注意ans要当作大小为0的物品转移

然后如果我们把背包大小定为\(min(k,siz_i)\),时间复杂度为\(O(nk)\)

2023.12.24联考T1

题目大意

给定一棵树,每个节点有个01权值,一棵树的贡献定义为满足 \(x\) 为 \(y\) 的祖先,且\(s_x=1,s_y=0\) 的 \((x,y)\) 的数量

现在可以反转k个权值,问最小贡献。对于 \(k=0\sim n\) 都输出答案

solution

首先考虑如果要把1改成0,那么要求它的子树一定都为1,否则不如改子树

0改成1同理,要求它到根都为0

所以可以考虑一个朴素的dp,设\(f_{i,j,k}\)表示节点i的子树,用了j个反转,下面有k个0,背包转移\(O(n^3)\)

在根据上面的结论,设\(f_{i,j,0/1/2}\)表示节点i的子树,用了j个反转,子树一定都为1/它到根都为0/不确定

标签:多重,背包,二进制,然后,子树,为根,权值,小结
From: https://www.cnblogs.com/zhy114514/p/18258896

相关文章

  • rebindMultiA:一款功能强大的多重A记录重绑定攻击测试工具
    关于rebindMultiArebindMultiA是一款功能强大的多重A记录重绑定攻击测试工具,该工具可以帮助广大研究人员通过针对目标域名执行多重A记录重绑定攻击,来测试目标域名或地址的安全情况。工具提供了一个rebindmultia.com域名,用来帮助广大研究人员使用该工具来进行测试实践。它会......
  • 代码随想录算法训练营第四十三天 | 完全背包理论基础、518.零钱兑换II、377. 组合总和
    完全背包理论基础题目链接:https://kamacoder.com/problempage.php?pid=1052文档讲解:https://programmercarl.com/%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98%E7%90%86%E8%AE%BA%E5%9F…视频讲解:https://www.bilibili.com/video/BV1uK411o7c9/思路完全背包中,每个物品可以......
  • 基础背包问题
    01背包有N种物品,第i种物品的体积是v[i],价值是w[i],每件物品最多只能选1件。有一个容量为V的背包,问将哪些物品装入背包,可使这些物品的总体积不超过背包,并且总价值最大,输出最大价值。#include<bits/stdc++.h>usingi64=longlong;voidsolve(){intN,V;std::cin......
  • 代码随想录算法训练营第四十一天 | 0-1背包问题
    46.携带研究材料二维数组题目链接文章讲解视频讲解动态规划五部曲:dp[i][j]:下标i表示背包装0-i的物品(任取),j表示当前背包的最大容量,dp[i][j]表示容量为j时,装0-i的物品的最大价值递推公式:dp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i])dp[i-1][j]表示j......
  • BEV detection(自底向上)小结
    LLShttps://zhuanlan.zhihu.com/p/589146284BEVDet提出一种优雅可行可扩展的范式,包含4个部分:image-viewencoder,viewtransformerfromimageviewtoBEV,bevencoder,head.pipelinemoduleAugmentation防止过拟合,不光对图片做增强,还对bevfeature做flipping,scali......
  • monocular 3D detection小结
    smoke参考https://zhuanlan.zhihu.com/p/452676265monodle通过大量密集实验(逐步用gt替换预测值测试),localizationerror是3d检测的关键。提出三点策略:1.重新思考了2d中心和3d中心的不对齐影响(用3dcenter替换2dcenter能提高性能,且2d检测能作为辅助任务帮助3d检测)2.去除较远......
  • lidar 3D decetion小结
    1.pointnetpointnet++:实现基于点云的分类和语义分割。提出了基于点云的特征提取网络。(https://zhuanlan.zhihu.com/p/336496973)2.VoxelNet:第一篇提出将点云转体素,进行3d检测。https://zhuanlan.zhihu.com/p/3524193163.SECOND:用spconv替换3d卷积,减少计算量。https://zhuanlan......
  • JavaWeb学习-前端知识小结
    前言参照B站尚硅谷的教程进行学习,对javaweb的前端知识做个简单的小结,主要内容包括html、css、javascript。其中html表示了前端页面的结构和元素,例如表格、文本框、表单等;css表示前端页面的样式,例如段落中文字的颜色、字体大小,表格中文字的颜色,字体大小等;JavaScript是弱类型的脚本......
  • MATLAB算法实战应用案例精讲-【数模应用】事后多重比较(附python、MATLAB和R语言代码实
    目录几个高频面试题目事后检验,多重比较,简单效应分析有什么区别?事后多重对比如何使用?算法原理SPSSAU疑难解惑提示‘数据质量异常’如何解决?如何做Dunnett法事后多重比较?方差分析事后多重比较提供‘字母标记法!’?关于方差分析时的效应量?字母标记法时没有输出结果?......
  • 各种方法优化背包
    对应试题为HDU5887HerbsGathering(背包问题的剪枝技巧)_搜索剪枝在装满背包的前提下求最小的多余个数-CSDN博客  1:使用map进行优化#include<bits/stdc++.h>#definelllonglongusingnamespacestd;map<int,ll>mp,tmp;map<int,ll>::iteratorit;intmain(){ int......