最近来一波基础算法吧,掌握基础原理方可行走天下。回溯法本质是用来搜索问题的解,典型地就是使用深度优先搜索,搜索路径一般沿树形结构进行,在搜索过程中,首先会判断所搜索的树结点是否包含问题的解,如果肯定不包含,则不再搜索以该结点为根的树结点,而向其祖先结点回溯;否则进入该子树,继续按深度优先策略搜索。
可能这么说不是很容易懂,咱们来的实例吧,那就是经典的0-1背包问题,关于这一问题后边很多算法都会涉及到,咱们一点点深入~
我们还是使用典型的三背包为例,问题描述如下:设有三个背包,其重量分别为:16,15, 15;价值分别为: 45,25,25;请选择背包,使其重量不超过30,但价值最大。
可以看出我们的约束条件为总重量不超过30,目标是价值最大,那我们就可以使用回溯法的思想来求解:
每个背包都可以被选择中或者不选,理论上如果不加任何限制的话一共有八种可能(2×2×2),但我们在搜索的过程中要时刻注意总重量不可超过30 ,在这个基础上使其总价值最大,于是我们可以从第一个背包开始,先选中它,其重量是16,小于30,没有问题,然后在选择第二个背包,其重量为15,二者总重量为31,超过30,所以不能选择第二个背包,同理第三个背包也不能选,也就是说在选中第一个背包的前提下,另外两个背包就都不能再选了,这是八种理论可能情况中的一种;以此类推,不选第一个背包,在此基础上选