把问题得解空间转化为图或树:
1.子集树:集合中满足条件的子集等,N叉树
2.排列树:确定n个元素满足某种性质的排列,“排列树”并不是N叉树,不能重复选择
0/1背包问题<——>二叉树(0,1)<——>子集树 backtrack(t) ——> 找到t层以下的所有解(每一层代表选不选该货物,0代表不选,1代表选)
O
0/ \1
O O
0 / 1 \ /0 \1
O OO O
if(t > N)
if(cur_value > best_value)
print && record
else{
for(int i = 0; i <= 1; i++){
x(t) = i;
if(i == 0) backtrack(t+1);
else{
if(cur_wight + w(t) <= total_wight){ //约束函数
cur_wight += w(t);
cur_value += v(t);
backtrack(t+1); //递归
cur_wight -= w(t);
cur_value -= v(t); //回溯
}
}
}
}
八皇后问题<——>八叉树<——>子集树问题:backtrack(t) ==>找到t层以下的所有