一、回溯法有“通用的解题法”之称,可以系统的搜索一个问题的所有解或任一解。它在问题的解空间中按深度优先策略,从根节点出发,搜索解空间树。算法搜索至解空间树的任一节点时,先判断该节点是否包含问题的解,如果肯定不包含则跳过对以该节点为根的子树的搜索,回到其父节点回溯。否则,进入该子树,继续按深度优先策略搜索。

利用回溯法解问题时一般按以下三步骤:

1)定义问题的解空间;

2)确定易于搜索的解空间结构;

3)以深度优先策略搜索解空间,并在搜索过程中用剪枝函数避免无效搜索;

二、回溯法应用——装载问题

一批集装箱共n个要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量为Wi且W1+W2+……+Wn<=c1+c2;试确定一个合理的装载方案使这n个集装箱装上这两艘轮船。

#include<stdlib.h>
#include<stdio.h>
#include<iostream.h>

typedef int Status;
typedef int Type;

int n=0;    //集装箱数
Type *x=(Type*)malloc((50)*sizeof(Type));//当前解
Type *bestx=(Type*)malloc((50)*sizeof(Type));//当前最优解
Type c=0,   //第一艘轮船的载重量
    cw=0,       //当前载重量
    bestw=0,    //当前最优载重量
    r=0,
    *w=(Type*)malloc((50)*sizeof(Type));    //集装箱重量数组

int Backtrack(int i)//搜索第i层节点
{
    int j_index;
/*如果到达叶结点,则判断当前的cw,如果比前面得到的最优解bestw 好,则替换原最优
解。*/
    if(i>n)
    {
        if(cw>bestw)
        {
            for(j_index=1; j_index<=n; j_index++)
                bestx[j_index]=x[j_index]; bestw=cw;
        }
        return 1;
    }

//搜索子树
    r-=w[i];
   if(cw+w[i]<=c)//搜索左子树,如果当前剩余空间可以放下当前物品也就是,cw + w[ i ] <= c
    {
        x[i]=1;
        cw+=w[i];//把当前载重 cw += w[ i ]
        Backtrack(i+1);//递归访问其左子树,Backtrack( i + 1 )
        cw-=w[i];//访问结束,回到调用点, cw - = w[ i ]
    }

if(cw+r>bestw)//搜索右子树
    {
        x[i]=0;
          Backtrack(i+1);
     }
     r+=w[i];
}
Type* Initiate()
{
     int index=1;
     printf("输入集装箱个数:");
     scanf("%d",&n);
     printf("输入轮船载重量:");
     scanf("%d",&c);

while(index<=n)//数组从1号单元开始存储
      {
          printf("输入集装箱%d 的重量:",index);
          scanf("%d",&w[index]);
          index++;
     }

bestw = 0;
     cw = 0;
     r = 0;
     for(index =1;index <= n; index++)
          r += w[index]; //初始时r 为全体物品的重量和
     printf("n=%d c=%d cw=%d bestw=%d r=%d\n",n,c,cw,bestw,r);

for(index=1;index<=n;index++)
      {
          printf("w[%d]=%d          ",index,w[index]);
     }
     printf("\n");
     return w;
}
int main()
{
     int i;
     Initiate();
    //计算最优载重量
     Backtrack(1);
     for(i=1;i<=n;i++)
      {
          printf("%d        ",w[i]);
          printf("%d\n",bestx[i]);
          }
     return bestw;
}

回溯法,回溯法解装载问题相关推荐

  1. 探讨与研究——动态规划算法、回溯法、分支限界法解0-1背包问题

    一个人终归是要成长的,是要不断历练的,没有人可以安安稳稳一辈子.就算是最有地位最有钱的人也要不断追求.不断历练.不断提升自己. 人的学问少时在不断学习,青年时期不断实践.随着时间推移,到了老年终有所成 ...

  2. DID会固定年份吗_倍分法DID详解 (二):多时点 DID (渐进DID)

    作者:王昆仑 (天津大学) Stata连享会 计量专题  || 公众号合集 2020寒假Stata现场班 (北京, 1月8-17日,连玉君-江艇主讲) 「+助教招聘」 2020寒假Stata现场班 文 ...

  3. java 回溯_java 实现迷宫回溯算法示例详解

    用一个7 x 7的矩形表示迷宫,0和1分别表示的是通路和障碍.通过设计编写程序找到蓝色小球达到蓝色旗子的路线 思路: 构建一个迷宫(用二维数组)实现找通路的方法findRoad() 构建二维数组不难, ...

  4. 【原创】赋值法写基础解系中解向量

    赋值法写基础解系中解向量 (一)背景引入 通常解方程组时,将系数矩阵化为行阶梯型,进而可化为行最简型 (说一嘴:行最简型是指阶梯口元素全是1,该1所在列全其余全为0:广义行阶梯的阶梯口处元素非1也可) ...

  5. rust如何在木板上上传图片_腐蚀rust游戏玩法方式详解

    在腐蚀这款游戏中玩家所有的物资都需要自己去寻找,不过很多时候遇到不怀好意的玩家时最好提高安全意识,及时躲避袭击,下面是游戏玩法发展方式详解. 游戏玩法方式详解 这里分两种发展方式 1.纯新手 首先需要 ...

  6. Python实现TOPSIS分析法(优劣解距离法)

    文章目录 (1).题目 (2).读取Excel表中的数据 (3).将不同的指标转换为极大型指标 (4).正向化矩阵标准化 (5).计算得分并归一化 (6).主函数 (7).完整代码部分 (8).计算结 ...

  7. 数学建模——TOPSIS法(优劣解距离法)学习笔记(一)

    一.TOPSIS方法 TOPSIS法(Technique for Order Preference by Similarity to Ideal Solution) 可翻译为逼近理想解排序法,国内常简 ...

  8. DID会固定年份吗_倍分法DID详解 (三):多时点 DID (渐进DID) 的进一步分析

    作者:王昆仑 (天津大学) E-mail: shawn0513@163.com 连享会专题课程:DSGE 模型及应用 连享会 DSGE 专题课程 这是连享会「倍分法(DID)专题推文」系列的第三篇文章 ...

  9. 倍分法DID详解 (二):多时点 DID (渐进DID)

      作者:王昆仑 (天津大学)   Stata连享会 计量专题 || 公众号合集   导入 在 「连享会 - 倍分法系列推文」-- 「倍分法DID详解 (一):传统 DID」 文中,我们详细介绍了 D ...

  10. 我的世界java版区块显示_我的世界手游区块显示指令分享:区块玩法操作详解[多图]...

    我的世界手游区块是一个独特的机制,很多玩家对于区块是什么不太了解,区块显示指令以及区块的产生不是很熟悉,为了帮助到大家,今天小编就为大家带来我的世界手游区块显示指令分享:区块玩法操作详解的内容,希望大 ...

最新文章

  1. 什么是Kafka Global Table (GlobalKTable)
  2. 利用SPRING管理热加载的GROOVY对象!
  3. Program type already present: android.support.v4.app.BackStackRecord$Op
  4. 网页3D效果库Three.js学习[二]-了解照相机
  5. matlab lj( )函数,matlab 函数调用问题
  6. 刚刚,百度AI公布最新进展:Apollo2.0,新课程,设全球研究院
  7. C#窗体间传值的简便方法/工具
  8. atitit.事件驱动的总结attilax
  9. Dynamic 365 中创建编码规则
  10. Linux之zip命令
  11. Linux电脑怎么接入arm开发板,PC机与ARM开发板之间实现NFS共享
  12. 卖西瓜问题(Java经典编程案例)
  13. 基于Flask的视频网站设计与实现(Python电影视频推荐系统)
  14. 网易云音乐常用API浅析
  15. 谷歌科学家:目标优化不好使?今天聊聊泛化这件事儿
  16. 美团招聘CV算法专家/AutoML专家
  17. 百度云盘下载慢解决办法
  18. Mysql数据库地区表 递归查询 省市区
  19. 我和计算机技术-在迅雷
  20. python中callable_Python abc.Callable方法代码示例

热门文章

  1. JAVA 开发命名规范——阿里巴巴Java开发手册
  2. JME3 官方教程翻译 - 自定义网格形状
  3. 怎样做网络推广浅析网站标题如何写更利于SEO?
  4. Kubernetes的Pod详解
  5. android EditText 属性
  6. const const
  7. 安装多版本Chrome
  8. 主动降噪相消干涉原理
  9. java smslib 发送短信错误信息
  10. SqlServer 触发器 详细讲解