您的位置:首页 > 其它

回溯

2015-10-31 10:31 204 查看
谈到bactkracing,主要就是两种,一种是排列树,一种是子集树。

排列树



伪代码:

//x[1..n]={1,2,3},,初始状态
backtrace(int t){
if(t>n)//如果超过了树的层数,说明已经排列完了
print(x[1..n])
else{
for(int i=t;i<=n;i++){
swap(x[i],x[t]);//这一层已经 出现所有以前层没有出现过的数
backtarce(t+1);//进入下一层
swap(x[i],x[t]);//回到上一层,还原上一层的场景
}
}
}


2.子集树

比如背包问题,有n个物品,是背包总价值最大,那结果可能是[0,1,…,1]1,0分别代表每一种物品选或者不选。



伪代码:

backtrace(int t){//当前层数
if(t>n){
print(x[1..n]);
}else{
for(int i=0;i<=1;i++){
x[t]=i;
if(underlimit(t)){
backtrace(t+1);
}
}
}

}


let’s back down to the bussiness.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  回溯算法