算法设计与分析——回溯法——装载问题
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];}}}
算法设计与分析——回溯法——装载问题相关推荐
- 算法设计与分析-回溯法
单选题 关于回溯法以下叙述中不正确的是( ). A. 回溯法有"通用解题法"之称,它可以系统地搜索一个问题的所有解或任意解 B. 回溯法是一种既带系统性又带跳跃性的搜索算法 C. ...
- 算法设计与分析——回溯法——批处理作业调度
问题描述:给定n个作业的集合{J1,J2,-,Jn}.每个作业必须先由机器1处理,然后由机器2处理.作业Ji需要机器j的处理时间为tji.对于一个确定的作业调度,设Fji是作业i在机器j上完成处理的时 ...
- 算法设计与分析——回溯法——n皇后问题
一.什么是N皇后问题? 在n×n格的棋盘上放置彼此不受攻击的n个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.n后问题等价于再n×n的棋盘上放置n个皇后,任何2个皇后 ...
- 算法设计与分析——回溯法——圆排列问题
#include<iostream> #include<math.h> using namespace std; class Circle {public:float Cent ...
- 算法设计与分析——回溯法——旅行售货员问题
#include<iostream> #include<bits/stdc++.h> using namespace std; const int noEdge=65535; ...
- 算法设计与分析——回溯法——符号三角形问题
#include<iostream> using namespace std;class Triangle{public:void Backtrack(int t);int n;//第一行 ...
- 算法设计与分析第5章 回溯法(二)【回溯法应用】
第5章 回溯法 5.2 应用范例 1.0-1背包问题 有n件物品和一个容量为c的背包.第i件物品的重量是w[i],价值是p[i].求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和 ...
- 算法设计与分析复习--回溯法
算法设计与分析期末复习 主要参考: 算法设计与分析(北京航空航天大学MOOC) 算法设计与分析(北京大学MOOC) 华中科技大学 计算机科学与技术学院 算法设计与分析 课堂教学PPT 五. ...
- 算法设计与分析之回溯法
文章目录 前言 一.回溯法概述 二.回溯法的基本思想 三.回溯法的设计步骤 四.回溯法效率分析 五.回溯法示例 总结 前言 大家好,越努力,越幸运,我是程序猿小猿.本篇文章小猿将跟您分享算法设计与分析 ...
最新文章
- SQL SERVER 查询所有数据表名称和数据行数
- 使用DispatchAction类,为你的系统减肥!
- mysql逻辑备份之mysqldump
- 【树莓派】如何设置树莓派 VNC 的分辨率
- python解析xml文件选用模块_Python标准库系列之xml模块
- 2021-09-02编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) 。
- android开发学习——day3
- ELK-日志收集工具nxlog
- 论文笔记——多源融合SLAM的现状与挑战
- VS2019C++编译GDAL3.3.2+SQLite3+PROJ6+GEOS3.7.3+HDF4+HDF5(保姆级教程)
- 360导致某些页面变为淡绿色
- python电影网络爬虫代码_Python爬虫——爬取豆瓣电影Top250代码实例
- 中药图片拍照识别系统全套开源
- 设置编程软件的背景颜色
- python截屏_Python: 截屏
- eclipse启动慢?试试如下操作
- 50M/s, Onedrive直链提取-IDM实现满速下载
- 使用线性回归,岭回归,Lasso回归预测鲍鱼年龄
- 大数据基石——Hadoop与MapReduce
- 【论文阅读】MIMICS: A Large-Scale Data Collection for Search Clarification
热门文章
- Docker4Dev #6 使用 Windows Container 运行.net应用
- .NET Core第三方开源Web框架YOYOFx
- powershell 脚本运行策略,参数....
- Linux开启fileinfo扩展
- Jupyter Notebook 入门指南
- 【ArcGIS风暴】ArcGIS创建栅格数据集色彩映射表案例--以GlobeLand30土地覆盖数据为例
- 完美解决ArcGIS10.x栅格空间插值报错无法进行和导出插值栅格结果出错的问题
- 用dataGridView实现增删改查
- React Native之didFocus和didBlur
- github上面如何编辑README