分支限定法,号称5大常用算法(回溯,贪心,动态规划,分治,分支限定法),一直认为分支限定法比较简单,无非就是宽搜+剪枝,所以练习不多,但是这次想尝试一下却出现了一些值得注意的易错点.
首先介绍下分支限定法,简单来说分支限界法以广度优先或以最小耗费优先的方式搜索解空间树。
举个例子,现在有这样一棵树
其中1,3访问完价值为6
1,2,4访问完价值为5,那么1,2,4这个分支可以省去,因为就算你之后所有的节点都取最好的,也比不过1,3这条已知的分支(它也可以取最好,但是它之前的就比你好)
当然还有你访问时要优先扩展价值较高的点,因为他们更有可能产生优秀的分支,而之后扫描较差的分支就可以直接剪去(而如果下一层先扫描差的,就可能让不良的分支也混进来了)。这里就需要用到一个优先权队列,直接用c++ stl 中的priority。
顺便说下priority,弹出是pop,返回顶部元素是top,而最关键的关键值比较格式如下
struct node
{
int vis[15];//每一个物品装入或没有
int val