回溯法——装载问题

简介: 回溯法——装载问题

有n个集装箱要装上载重量为w的轮船,其中集装箱i的重量为wi。不考虑集装箱体积的限制,现在要将若干集装箱装上轮船,使他们的总重量为w,如果总重量相同要尽可能的使用少的集装箱。


有n个集装箱要装上载重量为C1、C2的轮船,其中集装箱i的重量为wi。问两艘轮船能否装下所有集装箱。

深搜所有情况,重点是要剪枝。

题目一剪枝条件是,tw + w[i] <= weight && tw + rw >= weight。当前集装箱装入后是否超过最大载重量,当前集装箱总重加上剩下集装箱总重是否大于最大载重。

题目二剪枝条件是,tw + w[i] <= c1 && tw + rw > maxW当前集装箱装入后是否超过最大载重量,当前集装箱总重加上剩下集装箱总重是否大于最大载重。

#include<iostream>
#include<vector>
using namespace std;
vector <int> x(5,0);
vector <int> op(5, 0);
int min = 1e9;
int w[] = { 0,10,40,40 };
int weight = 10;
void dfs(int num, vector <int> &op, int tw, int rw,int count) {
  if (tw == weight&&count<::min) {
    for (int i = 0; i < 5;i++) {
      x[i] = op[i];
    }
    ::min = count;
    //一开始我担心op[i]会存储上次的结果,但是发现没有。因为每次dfs结束,当前结点都置零了。
  }
  else {
    for (int i = num; i < 5; i++) {
      if (tw + w[i] <= weight && tw + rw >= weight) {//主要就是剪枝做好就行了
        op[i] = 1;
        dfs(num + 1, op, tw + w[i], rw - w[i], count + 1);
        op[i] = 0;//回溯放在这个位置,一定要贴近递归,贴近原则!!!
      }
      //op[i] = 0;放在这个位置不对!!!会导致有些情况回溯不了
    }
  }
}
int maxW = -1e9;
int c1 = 50;
int c2 = 50;
void dfs2(int num, vector <int>& op, int tw, int rw) {
  if (num>0&&tw <= c1 && tw > maxW) {
    for (int i = 0; i < 5; i++) {
      x[i] = op[i];
    }
    maxW = tw;
  }
  else {
    for (int i = num; i < 4; i++) {
      if (tw + w[i] <= c1 && tw + rw > maxW) {//主要就是剪枝做好就行了
        op[i] = 1;
        dfs2(num + 1, op, tw + w[i], rw - w[i]);
        op[i] = 0;//回溯放在这个位置,一定要贴近递归,贴近原则!!!
      }
      //op[i] = 0;放在这个位置不对!!!会导致有些情况回溯不了
    }
  }
}
int main() {
  dfs2(0, op, 0, 90);
  for (auto it : x) {
    cout << it << " ";
  }
}
相关文章
|
5月前
|
存储 算法
算法编程(二十六):判断路径是否相交
算法编程(二十六):判断路径是否相交
58 0
|
4月前
|
存储 SQL 算法
LeetCode题目100:递归、迭代、dfs使用栈多种算法图解相同的树
LeetCode题目100:递归、迭代、dfs使用栈多种算法图解相同的树
|
4月前
|
C语言
C语言函数递归详解:理解递归的原理与应用
C语言函数递归详解:理解递归的原理与应用
84 0
|
5月前
|
自然语言处理 算法 编译器
编译原理复习四:编译器结构 消除左递归、左公因子 最右推导 寻找句柄讲解(附题目和答案)
编译原理复习四:编译器结构 消除左递归、左公因子 最右推导 寻找句柄讲解(附题目和答案)
143 0
案例4-1.4:堆中的路径 (小顶堆的模拟建立和模拟路径)
案例4-1.4:堆中的路径 (小顶堆的模拟建立和模拟路径)
71 0
|
算法 容器
【算法入门&二叉树】从先中后序的遍历到用中后序列构造二叉树|如何抵挡递归法该死的魅力(下
【算法入门&二叉树】从先中后序的遍历到用中后序列构造二叉树|如何抵挡递归法该死的魅力
83 0
|
算法 UED 容器
【算法入门&二叉树】从先中后序的遍历到用中后序列构造二叉树|如何抵挡递归法该死的魅力(上)
【算法入门&二叉树】从先中后序的遍历到用中后序列构造二叉树|如何抵挡递归法该死的魅力
114 0
|
算法 Java
【趣学算法】Day2 贪心算法——最优装载问题
【趣学算法】Day2 贪心算法——最优装载问题
146 0
数据结构与算法__08--霍夫曼树二叉树遍历:1.写在节点类中,在上层调用;2.写在主函数中一次性整体完成
霍夫曼树二叉树遍历:1.写在节点类中,在上层调用;2.写在主函数中一次性整体完成
|
存储
经典笔试题: 二叉树中和为某一值的路径(路径总和)
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。
102 0
经典笔试题: 二叉树中和为某一值的路径(路径总和)