算法设计与分析——回溯法——装载问题

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];}}} 

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306581.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入解析 C# 的 String.Create 方法

作者&#xff1a;Casey McQuillan译者&#xff1a;精致码农原文&#xff1a;http://dwz.win/YVW说明&#xff1a;原文比较长&#xff0c;翻译时精简了很多内容&#xff0c;对于不重要的细枝末节只用了一句话概括&#xff0c;但不并影响阅读。你还记得上一次一个无足轻重的细节点…

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

一、什么是N皇后问题&#xff1f; 在nn格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于再nn的棋盘上放置n个皇后&#xff0c;任何2个皇后不妨在同一行或同一列或同一斜线上。 问题…

全局程序集缓存gac中安装程序集_我就不信2W字把源码拆的这么碎,你还不明白mybatis缓存...

前言不知道大家看到这张图感觉怎么样&#xff0c;不是难&#xff0c;一共也没有几个组件&#xff0c;但是真的让我想当头疼&#xff0c;因为在面试的时候&#xff0c;就这张图&#xff0c;对&#xff0c;你没看错&#xff0c;就这几个组件&#xff0c;那是让我相当难受啊MyBati…

GraphQL:和EntityFramework更配哦

GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述&#xff0c;使得客户端能够准确地获得它需要的数据&#xff0c;而且没有任何冗余&#xff0c;也让 API 更容易地随着时间推移而演进&#xff0c…

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

#include<iostream> using namespace std;class Triangle{public:void Backtrack(int t);int n;//第一行的符号个数 int half;//n*(n1)/4 int count;//当前—的个数 int **p;//符号三角形矩阵 long sum; //已找到的符号三角形数 };void Triangle::Backtrack(int t) {if(…

mysql 默认事务隔离级别_MySQL 事务隔离级别详解

个人公众号『码农札记』&#xff0c;欢迎关注&#xff0c;查看更多精彩文章。 简介&#xff1a; MySQL的事务隔离级别一共有四个&#xff0c;分别是读未提交、读已提交、可重复读以及可串行化。四个特性ACID原子性 &#xff08;Atomicity&#xff09;事务开始后所有操作&#x…

如何在 Asp.Net Core 中对请求进行限流

译文链接&#xff1a;https://www.infoworld.com/article/3442946/how-to-implement-rate-limiting-in-aspnet-core.html在应用程序开发时&#xff0c;或许你有这样的想法&#xff0c;控制用户的请求频率来防止一些用户的恶意攻击&#xff0c;具体的说就是&#xff1a;为了预防…

算法设计与分析——动态规划——石子合并问题

1.石子合并问题 在一个圆形操场的四周摆放着n堆石子。现要将石子有序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆&#xff0c;并将新的一堆石子数记为该次合并的得分。设计一个算法&#xff0c;计算出将n堆石子合并成一堆的最小得分和最大得分。 #include<st…

软件层面可以做到重启本地串口吗_手机关机还是重启好?get这几招,手机更流畅...

遇到手机卡顿&#xff0c;很多人都会不自觉的选择重启手机&#xff0c;还是不行&#xff0c;就关机等一会儿再开机&#xff0c;这样几次下来手机真的就顺畅多了。那么关机和重启到底有什么区别&#xff1f;还有哪些方法可以保持手机流畅&#xff1f;跟着小编来了解一下&#xf…

在传统行业做数字化转型之团队篇

【数字化转型】| 作者 / Edison Zhou这是EdisonTalk的第309篇原创内容在过去的两年时间里&#xff0c;我加入了一家传统行业的企业参与其数字化转型的过程&#xff0c;现在我将我的经历分享出来&#xff0c;本文是第四部分—团队篇&#xff0c;主要会介绍一下我所在的经济适用型…

回顾 | 进击吧! Blazor!系列

Blazor 是一个 Web UI 框架&#xff0c;可通过 WebAssembly 在任意浏览器中运行 .Net 。Blazor 旨在简化快速的单页面 .Net 浏览器应用的构建过程&#xff0c;它虽然使用了诸如 CSS 和 HTML 之类的 Web 技术&#xff0c;但它使用 C&#xff03;语言和 Razor 语法代替 JavaScrip…

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

#include<iostream> #include<bits/stdc.h> using namespace std; const int noEdge65535; class Traveling {public:void BackTrack(int i);int n; //图G的顶点数 int *x; //当前的解 int *bestx; // 当前的最优解 int **a; // 图G的临界矩阵 int cc; //…

sql不等于0怎么表示_数组真的只能从0开始吗?python表示不同意

背景早在linux操作系统诞生开始&#xff0c;c语言作为linux系统的编程语言主力&#xff0c;它为后续的其他高级编程语言(如c、java)提供了很多语言级的语义和协议规范。数组做为linux操作系统最基本的数据结构之一&#xff0c;便是其中的一项语言级高级特性&#xff0c;深入理解…

ASP.NET Core 5.0新增功能摘要

.NET5.0发布了大半个月&#xff0c;从.NET Core3.1的平滑迁移体验令人心旷神怡&#xff0c;改个targetframework就完成迁移&#xff0c;不要太轻松&#xff01;然而&#xff0c;ASP.NET Core5.0也有很多有意思的改变&#xff0c;这里为大家摘录一下&#xff01;内置swagger在 A…

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

#include<iostream> #include<math.h> using namespace std; class Circle {public:float Center(int t);void Compute(void );void BackTrack(int t);float min; //当前最优值 float *x; //当前圆排列圆心横坐标 float *r; //当前圆排列 float *result; /…

数字图像处理王伟强_深度学习主导下,还有必要学数字图像处理?

图像处理技术作为计算机视觉的基础&#xff0c;通过计算机对图像进行去除噪声增强、复原、分割、提取特征等处理的方法和技术。多用于目标检测与目标识别等领域。>>数字图像处理、CV、CG与AI四者的关系图<<随着计算机视觉的迅速发展&#xff0c;基于深度学习的研究…

算法设计与分析——贪心算法——单个出水口打水问题

1.打水问题&#xff1a;有n个人去水房排队打水&#xff0c;只有一个出水口&#xff0c;且出水口流速恒定。每个人因为盛水的工具不一&#xff0c;打水所需的时间也不一致&#xff0c;设第i个人所需要的打水时间为ti&#xff1b;问如何安排打水顺序使得所有人的平均等待时间最短…

在传统行业做数字化转型之最终篇

【数字化转型】| 作者 / Edison Zhou这是EdisonTalk的第310篇原创内容在过去的两年时间里&#xff0c;我加入了一家传统行业的企业参与其数字化转型的过程&#xff0c;现在我将我的经历分享出来&#xff0c;本文是最终篇&#xff0c;主要会回答中途一些网友的问题以及推荐一些参…

算法设计与分析——贪心算法——汽车加油问题

汽车加油问题&#xff1a;一辆汽车加满油后可行驶n公里&#xff0c;旅途中有若干个加油站&#xff0c;两加油站间距离不超n 公里&#xff0c;起点离第一个加油站距离及最后一个加油站离终点距离也不超过n公里。算法给出应在哪些加油站停靠加油&#xff0c;使沿途加油次数最少。…

.NET Conf China 2020志愿者招募火热开启!还有神秘惊喜等你来领…

距.NET Conf China 2020 2020 中国 .NET 开发者大会开幕还有14天作为.NET的组织者之一我们已经为这个活动准备铺垫了很久但为了保证活动方方面面的质量为了给现场&线下的小伙伴们带来更好的体验现在&#xff01;我们十分需要你们的帮助&#xff01;为更好地做好大会服务工作…