0-1背包问题——回溯法求解

0-1背包问题:物品总数n,每个物品的体积w[i],价值v[i],给定背包的总容量W,求放入背包中物品的最大价值。

用回溯法对0-1背包问题进行求解,具体思路是:

1.使用解空间进行标记每个物品的放入情况,即要建立一个数组进行保存其是否放入,可使用 bool  x[i]进行标识;

2.回溯法第一感觉上是穷举所有情况,但事实上,有好多种情况可以进行避免,即若第t个物品放入后(即x[t]=1)已经超出背包重量,那么,在x[t]=1情况下的t+1—n个物品就不用再考虑,这样可以节省好多时间,回溯法有区别与穷举法;

3.对于解空间,用解空间数进行组织数据,解空间树的深度就是问题的规模n;

4.在解空间树中,我们用左子树、右子树分别标记1/0情况,即左子树的边代表放入,右子树的边代表不放入;

5.建立回溯函数是重中之重,回溯函数建立分三步:

 1 void Backtrack(int t)
 2 {
 3     if(t > n){  //是否到达叶节点
 4         for(int i = 1; i <= n; i++){
 5             best_x[i] = x[i];   //记录回溯的最优情况
 6         }
 7         best_v = now_v; //记录回溯中的最优价值
 8         return;
 9     }
10     if(now_w + w[t] <= W){  //约束条件,是否放入。放入考虑左子树,否则考虑右子树
11         x[t] = 1;
12         now_w += w[t];
13         now_v += v[t];
14         Backtrack(t+1); //进行下一个节点的分析
15         now_w -= w[t];  //在到达叶节点后进行回溯
16         now_v -= v[t];
17     }
18     if(Bound(t+1) > best_v){    //限界条

你可能感兴趣的:(数据结构与算法)