0027算法笔记——【回溯法】回溯法与装载问题

自己写的代码:


#include <iostream>
using namespace std; template <class Type>
class Loading
{//friend Type MaxLoading(Type[],Type,int,int []);//private:public:void Backtrack(int i);int n,         //集装箱数*x,           //当前解*bestx;        //当前最优解Type *w, //集装箱重量数组c,         //第一艘轮船的载重量cw,          //当前载重量bestw,       //当前最优载重量r;          //剩余集装箱重量
};//template <class Type>
//void  Loading <Type>::Backtrack (int i);template<class Type>
Type MaxLoading(Type w[], Type c, int n, int bestx[]);int main()
{   int n=10,m;int c=500,c2=121;int w[11]={ 0,21,54,21,45,20,65,320,1,20,54};int bestx[10];m=MaxLoading(w, c, n, bestx);cout<<"轮船的载重量分别为:"<<endl;cout<<"c(1)="<<c<<",c(2)="<<c2<<endl;cout<<"待装集装箱重量分别为:"<<endl;cout<<"w(i)=";for (int i=1;i<=n;i++){cout<<w[i]<<" ";}cout<<endl;cout<<"回溯选择结果为:"<<endl;cout<<"m(1)="<<m<<endl;cout<<"x(i)=";for (int i=1;i<=n;i++){cout<<bestx[i]<<" ";}cout<<endl;int m2=0;for (int j=1;j<=n;j++){m2=m2+w[j]*(1-bestx[j]);}cout<<"m(2)="<<m2<<endl;if(m2>c2){cout<<"因为m(2)大于c(2),所以原问题无解!"<<endl;}return 0;
}template <class Type>
void  Loading <Type>::Backtrack (int i)// 搜索第i层结点
{if (i > n)// 到达叶结点{  if (cw>bestw){for(int j=1;j<=n;j++) {bestx[j]=x[j];//更新最优解bestw=cw; }} return;}r-=w[i]; if (cw + w[i] <= c) // 搜索左子树{ x[i] = 1;cw += w[i];Backtrack(i+1);cw-=w[i];    }if (cw + r > bestw){x[i] = 0;  // 搜索右子树Backtrack(i + 1);  }r+=w[i];
}template<class Type>
Type MaxLoading(Type w[], Type c, int n, int bestx[])//返回最优载重量
{Loading<Type>X;//初始化XX.x=new int[n+1];X.w=w;X.c=c;X.n=n;X.bestx=bestx;X.bestw=0;X.cw=0;//初始化rX.r=0;for (int i=1;i<=n;i++){X.r+=w[i];}X.Backtrack(1);delete []X.x;return X.bestw;
}


第二程序:

#include<iostream>
using namespace std;class Loading
{public:int n;//当前集装箱的个数 // int *x;//当前的解 int *bestx;//目前的最优解 int *w;//集装箱的重量数组 int c;//第一艘轮船的装载量 int cw;//当前的装载量 int bestw;//目前的最优装载量 //   int r;//剩余集装箱重量 void Backtrack(int i);//求第i层结点 };
void Loading::Backtrack(int i)//搜索第i层结点
{if(i>n)//搜索到了叶子结点 {if(cw>bestw)//当前的载重量>目前最优载重量 {bestw= cw;}else{return ;} }else//还没有搜索到叶子结点时 {if(cw+w[i]<=c)//可以添加这个结点进入第一艘轮船,即左子树 {cw=cw+w[i];//需要在当前的载重量中加上该节点的重量 Backtrack(i+1);//搜索下一层cw=cw-w[i];// 必须放到这里面 ,如果不算这个节点时,需要将刚加上的w【i】减去 } // else 添加上这个else会出错  因为无论如何都要走右子树 //不添加这个结点进入第一艘轮船,即右子树 //{Backtrack(i+1);// } }
}int  MaxLoading(int w[],int c,int n)
{//初始化 Loading  Loading X;X.w=w;X.c=c;X.n=n;X.bestw=0;X.cw=0;X.Backtrack(1);return X.bestw;}
int main()
{cout<<"输入轮船的载重量分别:";int c1,c2;cin>>c1>>c2;cout<<"输入待装集装箱的个数:";int n;cin>>n;cout<<"输入待装集装箱的重量序列:";int w[n+1];for(int i=1;i<=n;i++){cin>>w[i];} cout<<MaxLoading( w,c1,n);
}


第三程序:

#include<iostream>
using namespace std;class Loading
{public:int n;//当前集装箱的个数 // int *x;//当前的解 int *bestx;//目前的最优解 int *w;//集装箱的重量数组 int c;//第一艘轮船的装载量 int cw;//当前的装载量 int bestw;//目前的最优装载量 int r;//剩余集装箱重量 void Backtrack(int i);//求第i层结点 };
void Loading::Backtrack(int i)//搜索第i层结点
{if(i>n)//搜索到了叶子结点 {if(cw>bestw)//当前的载重量>目前最优载重量 {bestw= cw;}else{return ;} }else//还没有搜索到叶子结点时 {r-=w[i];//因为在初始化的时候就已经把该节点的重量加到了r中去了 if(cw+w[i]<=c)//可以添加这个结点进入第一艘轮船,即左子树 {cw=cw+w[i];//需要在当前的载重量中加上该节点的重量 Backtrack(i+1);//搜索下一层cw=cw-w[i];// 必须放到这里面 ,如果不算这个节点时,需要将刚加上的w【i】减去 } //不添加这个结点进入第一艘轮船,即右子树 if(cw+r>bestw)//剪枝函数 {Backtrack(i+1);}r+=w[i];//不管如何都要在加上这个w[i] }
}int  MaxLoading(int w[],int c,int n)
{//初始化 Loading  Loading X;X.w=w;X.c=c;X.n=n;X.bestw=0;X.cw=0;X.r=0;for(int i=1;i<=n;i++){X.r+=w[i];} X.Backtrack(1);return X.bestw;}
int main()
{cout<<"输入轮船的载重量分别:";int c1,c2;cin>>c1>>c2;cout<<"输入待装集装箱的个数:";int n;cin>>n;cout<<"输入待装集装箱的重量序列:";int w[n+1];for(int i=1;i<=n;i++){cin>>w[i];} cout<<MaxLoading( w,c1,n);
}


第四程序:
输出带有序列

#include<iostream>
using namespace std;
class Loading
{public:int n;//集装箱的个数 int *w;//每个集装箱对应的重量 int c;//第一艘船的载重量int *x;//用于存储当前的解序列int *bestx;//用于存储目前的最优解 int bestw;//目前最优的载重量int cw;//当前的载重量 int r;//当前剩余的集装箱的重量 void Backtrack(int i);
};
void  Loading::Backtrack(int i)
{if(i>n)//搜索到了叶子结点 {if(cw>bestw)//当前的载重量>目前最优载重量 {for(int i=1;i<=n;i++){bestx[i] = x[i];}bestw= cw;}else{return ;} }else//还没有搜索到叶子结点时 {r-=w[i];//因为在初始化的时候就已经把该节点的重量加到了r中去了 if(cw+w[i]<=c)//可以添加这个结点进入第一艘轮船,即左子树 {x[i] = 1;cw=cw+w[i];//需要在当前的载重量中加上该节点的重量 Backtrack(i+1);//搜索下一层cw=cw-w[i];// 必须放到这里面 ,如果不算这个节点时,需要将刚加上的w【i】减去 } //不添加这个结点进入第一艘轮船,即右子树 if(cw+r>bestw)//剪枝函数 {x[i] = 0;Backtrack(i+1);}r+=w[i];//不管如何都要在加上这个w[i] }
}
int  MaxLoading(int n,int *w,int c,int *bestx)
{Loading X;X.n = n;X.w = w;X.bestx = bestx;X.c = c;X.bestw = 0;X.cw = 0;X.r = 0;X.x = new int [n+1];for(int i=1;i<=n;i++){X.r += w[i];}X.Backtrack(1);delete []X.x;return X.bestw;
}
int main()
{cout<<"输入轮船的载重量分别:";int c1,c2;cin>>c1>>c2;cout<<"输入待装集装箱的个数:";int n;cin>>n;cout<<"输入待装集装箱的重量序列:";int w[n+1];for(int i=1;i<=n;i++){cin>>w[i];} int bestx[n+1];int total_w=0;for(int i=1;i<=n;i++){total_w+=w[i];}if(total_w-MaxLoading( n,w,c1,bestx)>c2){cout<<"no solution"<<endl;return 0;}else{cout<<MaxLoading( n,w,c1,bestx)<<endl;for(int i=1;i<=n;i++){cout<<" "<<bestx[i];}}}

算法设计与分析——回溯法——装载问题相关推荐

  1. 算法设计与分析-回溯法

    单选题 关于回溯法以下叙述中不正确的是( ). A. 回溯法有"通用解题法"之称,它可以系统地搜索一个问题的所有解或任意解 B. 回溯法是一种既带系统性又带跳跃性的搜索算法 C. ...

  2. 算法设计与分析——回溯法——批处理作业调度

    问题描述:给定n个作业的集合{J1,J2,-,Jn}.每个作业必须先由机器1处理,然后由机器2处理.作业Ji需要机器j的处理时间为tji.对于一个确定的作业调度,设Fji是作业i在机器j上完成处理的时 ...

  3. 算法设计与分析——回溯法——n皇后问题

    一.什么是N皇后问题? 在n×n格的棋盘上放置彼此不受攻击的n个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.n后问题等价于再n×n的棋盘上放置n个皇后,任何2个皇后 ...

  4. 算法设计与分析——回溯法——圆排列问题

    #include<iostream> #include<math.h> using namespace std; class Circle {public:float Cent ...

  5. 算法设计与分析——回溯法——旅行售货员问题

    #include<iostream> #include<bits/stdc++.h> using namespace std; const int noEdge=65535; ...

  6. 算法设计与分析——回溯法——符号三角形问题

    #include<iostream> using namespace std;class Triangle{public:void Backtrack(int t);int n;//第一行 ...

  7. 算法设计与分析第5章 回溯法(二)【回溯法应用】

    第5章 回溯法 5.2 应用范例 1.0-1背包问题 有n件物品和一个容量为c的背包.第i件物品的重量是w[i],价值是p[i].求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和 ...

  8. 算法设计与分析复习--回溯法

    算法设计与分析期末复习 主要参考: ​ 算法设计与分析(北京航空航天大学MOOC) ​ 算法设计与分析(北京大学MOOC) ​ 华中科技大学 计算机科学与技术学院 算法设计与分析 课堂教学PPT 五. ...

  9. 算法设计与分析之回溯法

    文章目录 前言 一.回溯法概述 二.回溯法的基本思想 三.回溯法的设计步骤 四.回溯法效率分析 五.回溯法示例 总结 前言 大家好,越努力,越幸运,我是程序猿小猿.本篇文章小猿将跟您分享算法设计与分析 ...

最新文章

  1. SQL SERVER 查询所有数据表名称和数据行数
  2. 使用DispatchAction类,为你的系统减肥!
  3. mysql逻辑备份之mysqldump
  4. 【树莓派】如何设置树莓派 VNC 的分辨率
  5. python解析xml文件选用模块_Python标准库系列之xml模块
  6. 2021-09-02编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) 。
  7. android开发学习——day3
  8. ELK-日志收集工具nxlog
  9. 论文笔记——多源融合SLAM的现状与挑战
  10. VS2019C++编译GDAL3.3.2+SQLite3+PROJ6+GEOS3.7.3+HDF4+HDF5(保姆级教程)
  11. 360导致某些页面变为淡绿色
  12. python电影网络爬虫代码_Python爬虫——爬取豆瓣电影Top250代码实例
  13. 中药图片拍照识别系统全套开源
  14. 设置编程软件的背景颜色
  15. python截屏_Python: 截屏
  16. eclipse启动慢?试试如下操作
  17. 50M/s, Onedrive直链提取-IDM实现满速下载
  18. 使用线性回归,岭回归,Lasso回归预测鲍鱼年龄
  19. 大数据基石——Hadoop与MapReduce
  20. 【论文阅读】MIMICS: A Large-Scale Data Collection for Search Clarification

热门文章

  1. Docker4Dev #6 使用 Windows Container 运行.net应用
  2. .NET Core第三方开源Web框架YOYOFx
  3. powershell 脚本运行策略,参数....
  4. Linux开启fileinfo扩展
  5. Jupyter Notebook 入门指南
  6. 【ArcGIS风暴】ArcGIS创建栅格数据集色彩映射表案例--以GlobeLand30土地覆盖数据为例
  7. 完美解决ArcGIS10.x栅格空间插值报错无法进行和导出插值栅格结果出错的问题
  8. 用dataGridView实现增删改查
  9. React Native之didFocus和didBlur
  10. github上面如何编辑README