首页 > 其他 > 详细

TopCoder玩耍记录-- backtrack 回溯法 解决0-1背包问题

时间:2015-01-02 02:08:53      阅读:422      评论:0      收藏:0      [点我收藏+]
       回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。用回溯算法解决问题的一般步骤为:
1、定义一个解空间,它包含问题的解。
2、利用适于搜索的方法组织解空间。
3、利用深度优先法搜索解空间。
4、利用限界函数避免移动到不可能产生解的子空间。
问题的解空间通常是在搜索问题的解的过程中动态产生的,这是回溯算法的一个重要特性。     摘自百度百科
      
      对于回溯的思想,抓住两点一个是组织解空间, 一个是用DFS搜索解空间
      
      相对于0-1背包问题,这种数据求集合的子集之类的问题,固有的思维方式就是建造解空间为一颗子集树(一个完全平衡二叉树)
       子集树的特点就是所有的子集都是问题的解,而这些节都是在这个树的叶子结点上。
      bubuko.com,布布扣
      既然知道了解空间 , 那么就可以实施第点了,就是根据这颗树得到每个叶子结点的值,当然是用DFS啦!
     现在来说说n-1背包问题:
     bubuko.com,布布扣
   上图是处理abcd四个物品放入包中的解集,直接上回溯算法的代码

点击(此处)折叠或打开

  1. #include "stdafx.h"
  2. #include <string>
  3. using namespace std;
  4. #define GOODNUMBER 4
  5. #define BAGWIGHT 15
  6. typedef struct
  7. {
  8.     int w;
  9.     int v;
  10.     string name;
  11.     int visit;
  12. }GOODS;

  13. GOODS x[GOODNUMBER] = {0};
  14. int allwight = 0;
  15. int allValue = 0;
  16. void backtrack(int t)
  17. {
  18.     if (t == GOODNUMBER)
  19.     {
  20.         //到了叶子结点
  21.         printf("Value is %d\n",allValue);
  22.         return;
  23.     }
  24.     if((x[t].w + allwight) <= BAGWIGHT) //进入左子树
  25.     {
  26.         allwight += x[t].w;
  27.         allValue += x[t].v;
  28.         x[t].visit = 1;
  29.         backtrack(t + 1);
  30.         allwight -= x[t].w;
  31.         allValue -= x[t].v;
  32.         x[t].visit = 0;
  33.     }
  34.     if (x[t].visit == 0)
  35.     {
  36.         backtrack(t + 1); //进入右子树
  37.     }
  38.     
  39. }

  40. int _tmain(int argc, _TCHAR* argv[])
  41. {
  42.     GOODS A = { 7, 5, "A" };
  43.     GOODS B = { 3, 1, "B" };
  44.     GOODS C = { 5, 8, "C" };
  45.     GOODS D = { 8, 4, "D" };
  46.     x[0] = A;
  47.     x[1] = B;
  48.     x[2] = C;
  49.     x[3] = D;
  50.     backtrack(0);
  51.     getchar();
  52.     return 0;
  53. }

TopCoder玩耍记录-- backtrack 回溯法 解决0-1背包问题

原文:http://blog.chinaunix.net/uid-24922718-id-4730261.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!