实验五箱子装载问题.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验五 箱子装载问题 一、实验目的: 理解和复习所学各种算法的概念; 掌握和复习所学各种算法的基本要素; 掌握各种算法的优点和区别; 通过应用范例掌握选择最佳算法的设计技巧与策略; 二、实验内容及要求: 1、使用贪心算法、回溯法、分支限界法解决箱子装载问题。(任选两种) 2、通过上机实验进行算法实现。 3、保存和打印出程序的运行结果,并结合程序进行分析,上交实验报告。 三、实验原理: 贪心算法原理: 贪心算法通过一系列的选择来得到问题的解。他所做的每一个选择都是当前状态下局部最好选择,即贪心选择。 回溯法原理: 从开始结点出发,以深度优先方式搜索整个解空间。这个结点成为活结点,同时也成为当前的扩展结点。在当前的扩展结点处,搜索向纵深方向一致一个新结点。 四、程序代码: 1、贪心算法: #include cstdio #include cstring #include algorithm using namespace std; const int maxn = 1000; int w[maxn]; int x[maxn]; int main() { int n,c; printf(输入集装箱数量和轮船载重量:); while(~scanf(%d %d,n,c)) { printf(输入集装箱的重量:); memset(x,0,sizeof(x)); for(int i=0;in;i++) scanf(%d,w[i]); sort(w,w+n); int ans = 0; for(int i=0;in;i++) if(ans+w[i]=c) { ans+=w[i]; x[i]=1; } printf(最大装载为 %d\n,ans); printf(选中的集装箱重量分别为:\n); for(int i=0;in;i++) if(x[i]) printf(%d ,w[i]); } } 2、回溯法 #includeiostream using namespace std; class Loading { friend float MaxLoading(float[],float,int); public: void Backtrack(int i); int n; int *x,*bestx; float *w,c,cw,bestw,r; }; float Maxloading(float w1[],float c1,float c2,int n1,int bestx1[]) { Loading k; int j; float MAXLoad; k.x= new int [n1+1]; k.bestx=bestx1; k.w = w1; k.c = c1; k.n = n1; k.cw = 0; k.bestw = 0; k.r = 0; for(int i=1;i=n1;i++) k.r+=w1[i]; k.Backtrack(1); delete [] k.x; cout船1最优装载:k.bestwendl; MAXLoad=k.bestw; for( j=1;j=n1;j++) { if(k.bestx[j]==0) { MAXLoad+=w1[j]; c2-=w1[j]; if(c20) { cout找不到合理装载方法endl; return -1; } } } cout船1中的箱子:; for( j=1;j=n1;j++) if(k.bestx[j]==1) coutj ; coutendl; cout船2中的箱子:; for( j=1;j=n1;j++) if(k.bestx[j]==0) coutj ; coutendl; return MAXLoad; } void Loading::Backtrack(int i) { if(in) { if(cwbestw) { 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

文档评论(0)

haihang2017 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档