本人此时还是一名研一的小菜鸡,刚学会了这个算法的基本概念,来总结一下,谁知道今后的我再看到这篇自己写的博客的时候会不会笑出来,哈哈哈哈哈哈哈哈,所以吗,错了的化大佬们评论指正就好了。
还有系列文章动态规划法解01背包问题,回溯法解01背包问题哈,需要的化以下是链接:
动态规划法:https://blog.csdn.net/qq_29051107/article/details/103394491
回溯法:https://blog.csdn.net/qq_29051107/article/details/103395285
给定n种物品和一背包。物品i的体积是Si,其价值为Vi,背包的容量为C。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大?
物品的个数n=3,背包容量C = 30, S =(16,15,15),价值W =(45,25,25)
回溯法以深度优先的方式搜索解空间树,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树。
常见的两种分支限界法
(1)队列式(FIFO)分支限界法:按照队列先进先出(FIFO)原则选取下一个结点为扩展结点。
(2)优先队列式分支限界法:按照优先队列中规定的优先级选取优先级最高的结点成为当前扩展结点。
按照队列先进先出(FIFO)原则选取下一个结点为扩展结点
队列空 A→{A};
A先进先出 →{B,C};
B先进先出 →D,E;
由于D不合法,剔除;
E入 →{C,E};
C先进先出 →F,G →{E,F,G};
E先进先出→H,I →{F,G,I};
H不合法,剔除;
F先进先出→J,K→{G,I,J,K};
G先进先出→L,M→{I,J,K,L,M};
此时已到达叶子节点,计算各合法分支的值,最优值为50,对应的最优解为{0,1,1}
按照优先队列中规定的优先级选取优先级最高的结点成为当前扩展结点。
在本例中,优先级即为各节点的价值,当前价值高的节点优先。
队列空 A→{A};
A → B,C→{B,C};
B的价值为45, C的价值为0, 则B出 →D,E;
由于D不合法,剔除;
E入 →{C,E};
E的价值大于C的价值,则 E出 →F,G →{C,F,G};
由于F不合法,剔除;
此时, G为叶子节点,则只能C出→H,I →{H,I};
H的价值为25, I为0,则H出→J,K →{I,J,K};
J,K均为叶子节点,则只能I出→L,M→{L,M};
此时各分支均已到达叶子节点,计算各合法分支的值,则最优值为50,最优解为{0,1,1}。
两种方法生成节点的顺序不同,最优解完全一样。