算法实训报告.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文档。上传文档
查看更多
算法实训报告

陕西国防工业职业技术学院 算法实训报告 题 目: 最优时间表问题 班 级: 软件30** 姓 名: *** 学 号: #** 指导老师: *** *** 实训时间: 第16周 实训地点: 8-504 软件教研室制 最优时间表 问题描述 一台精密仪器的工作时间为 n 个时间单位, 与仪器工作时间同步进行若干仪器维修程序. 一旦启动维修程序, 仪器必须进入维修程序. 如果只有一个维修程序启动, 则必须进入该维修程序. 如果在同一时刻有多个维修程序, 可任选进入其中的一个维修程序. 维修程序必须从头开始,不能从中间插入. 一个维修程序从第 s 个时间单位开始, 持续 t 个时间单位, 则该维修程序在第 s+t-1 个时间单位结束. 为了提高仪器使用率, 希望安排尽可能少的维修时间. 对于给定的维修程序时间表, 计算最优时间表下的维修时间. 数据输入 输入数据的第 1 行有 2 个小于 10000 的正整数 n 和 k, n 表示仪器的工作时间单位, k 是维修程序数. 接下来的 k 行中, 每行有 2 个表示维修程序的整数 s 和 t, 该维修程序从第 s 个时间单位开始, 持续 t 个时间单位. 数据输出 在一行上输出最少维修时间. Input 15 6 1 2 1 6 4 11 8 5 8 1 11 5 Output 11 问题分析 本题来说就是要求在所给的维修集合中选出某一极大相容维修子集合,使其所用时间最少。 对所有维修的起始时间进行排序。 (t0,t1,…,tk)(titj,ij)。R(tk,T)表示起始时间为tk,执行时间为T的维修 最优子结构性质 设( R(t0,T0) , R(t1,T1), … R(tm,Tn)) 是所给最优时间表问题的一个最优解,即不存在tj,使tm+Tntj, 则( R(t0,T0) , R(t1,T1), … R(tm-1,Tn-1))是ttm的最优时间表问题的一个最优解. 递归关系 设S(i)表示执行R(ti,Tj) 后用于维修的最少时间。则Min S(i) = Min S (i-1) +T(Ri) 算法描述 建立一个n位长的数组S,每位表示一个时间。对任意维修R(tk,T)(tk+Tn),它要么进行,要么不进行。 R(tk,T)要进行,则要么k=0,要么在tk-1到tk之间某点tx有某个维修完成。令S(tk+T-1)=S(tx)+T,表示执行R(tk,T)后所用的维修时间。则可求出所有执行R(tk,T)后的维修时间并求的最小值。以此类推,即可求出所有可能极大相容子集的最少维修时间。 算法时间复杂性: 算法的时间复杂性与工作时间的范围n及维修数k及起分布有关。 n+k=O(n,k)n×k,一般情况下,O(n,k)=n+k. 程序: #include iostream using namespace std; int *worktime=0; int **repairtime=0; int n; int k; int mintime() { int temp; int down=0,up=0; int x,y; int i,j; int sign=0; while((downk)(upk)(repairtime[up][0]==repairtime[down][0])) up++; x=repairtime[down][0]; for(j=down;jup;j++){ y=repairtime[j][1]; worktime[x+y-2]=y; } for(i=0;in;i++) { x=repairtime[down][0]-1; sign=0; if ((ix)(worktime[i]!=n)) { for(j=down;jup;j++) { y=repairtime[j][1]; if(x+y-1=n) y=n-x; if (worktime[i]+yworktime[x+y-1]) worktime[x+y-1]=worktime[i]+y; sign=1; } if (sign=1) worktime[i]=n; } else if (i=x) { down=up; if(down=k)break; while((downk)(upk)(repairtime[up][0]=

文档评论(0)

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

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

1亿VIP精品文档

相关文档