0-1背包问题(回朔法搜索子集树)
2006-12-01 22:59
369 查看
将解空间用一颗完全二叉树表示,用回朔法搜索这颗树:
[b]解法1:[/b]建立了一个完全二叉树(称子集树),结点中带有需要的信息,深度优先遍历这颗二叉树(递归方法),
找到最优解。
[b]困难:[/b]如何记录当前的路径?
解决方案:1、设置一个栈
2、在递归调用“深度优先遍历左子树”之前,将0压入栈;在递归调用“深度优先遍历右子树”之前,将1压入栈
3、当递归调用出来后,将栈顶元素弹出
这样到了页结点的时候,栈中的元素就是一个解
解法2:(巧妙)不需要建立树的代码,只需要用一个数组存放访问路径,核心代码如下:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
void Backtrack(int t)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
if(t>n) Output();
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
else
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
for (int i=0;i<=1;i++)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
path[i]与path[t]交换;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
if (Constraint()&&Bound(t)) Backtrack(t+1);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
递归到最后一层时,数组path中的值(0,1序列)就是这一趟的解
[b]解法1:[/b]建立了一个完全二叉树(称子集树),结点中带有需要的信息,深度优先遍历这颗二叉树(递归方法),
找到最优解。
[b]困难:[/b]如何记录当前的路径?
解决方案:1、设置一个栈
2、在递归调用“深度优先遍历左子树”之前,将0压入栈;在递归调用“深度优先遍历右子树”之前,将1压入栈
3、当递归调用出来后,将栈顶元素弹出
这样到了页结点的时候,栈中的元素就是一个解
解法2:(巧妙)不需要建立树的代码,只需要用一个数组存放访问路径,核心代码如下:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
void Backtrack(int t)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
if(t>n) Output();
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
else
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
for (int i=0;i<=1;i++)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
path[i]与path[t]交换;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
if (Constraint()&&Bound(t)) Backtrack(t+1);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
递归到最后一层时,数组path中的值(0,1序列)就是这一趟的解
相关文章推荐
- ZOJ 3631超大背包问题(DFS || 折半搜索)
- 记忆搜索与动态规划——DP背包问题
- 暴力搜索解0-1背包问题
- 背包问题(深度优先搜索解法)
- python 回溯法 子集树模板 系列 —— 3、0-1背包问题
- P11: 背包问题的搜索解法
- CJOJ 2022 【一本通】简单的背包问题(搜索)
- P11: 背包问题的搜索解法
- C++:暴力搜索全排列解决背包问题
- 01背包问题(当有的背包重量是非整数时)的递归(优化成动态规划+再用滚动数组优化)解法+一些动态规划(递归,搜索)的高级技巧
- P11: 背包问题的搜索解法
- 背包问题的搜索解法(转自冰尘碎雨)
- 0-1背包问题(回溯_子集树)
- HDU上的专题训练(背包问题-线段树+树状数组+DP优化+网络流+字符匹配+最短路+矩阵乘法+搜索专题++)
- 回朔法、分支限界法解0-1背包问题程序, Java, C#
- 162_超大背包问题 (双向搜索)
- 暴力搜索解0-1背包问题
- 二叉树搜索求解背包问题
- 树:深度优先搜索、广度优先搜索、背包问题
- Lucene搜索结果排序问题(按时间倒序排的替代解决方法)