- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
算法设计技巧与分析 贪心算法—活动安排问题 贪心算法 贪心算法总是作出在当前看来最好的选择,也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。 贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。如单源最短路经问题,最小生成树问题等。在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。 贪心算法 贪心算法通常用于求解最优化问题,即量的最大化或最小化问题。算法每一步工作较少且基于信息,因此特别有效。 贪心算法通常包含一个用以寻找局部最优解的迭代过程。其在少量计算的基础上做出了正确猜想而且不考虑以后情况,一步步来构筑解,每一次均建立在局部最优解的基础上。每一步同时又扩大了部分解的规模,做出的选择产生最大的直接收益而又保持可行性。 算法缺陷在于要证明该算法确实是求解了要解决的问题。 贪心算法 活动安排问题 活动安排问题是可以用贪心算法有效求解的一个很好的例子。该问题要求高效地安排一系列争用某一公共资源的活动。 贪心算法提供了一个简单、 漂亮的方法使得尽可能多 的活动能兼容地使用公共 资源。 设有n个活动的集合e={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且sifi。如果选择了活动i,则它在半开时间区间[si,fi]内占用资源。若区间[si,fi]与区间[sj,fj]不相交,则称活动i与活动j是相容的。也就是说,当si≥fi或sj≥fj时,活动i与活动j相容。活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合。 在下面所给出的解活动安排问题的贪心算法schedule中,各活动的起始时间和结束时间存储于数组s和f{中且按结束时间的非减序:. f1≦f2 ≦··· ≦fn排列。如果所给出的活动未按此序排列,我们可以用o(nlogn)的时间将它重排。 贪心算法 活动安排问题 贪心算法 if(s[i]=f[j]) {a[i]=true;n++;j=i;} else a[i]=false; coutthe least amount meeting place is :n; return n; } 算法schedule中用集合a来存储所选择的活动。活动i在集合a中,当且仅当a[i]的值为true。变量 n用以记录最近一次加入到a中的活动。 贪心算法schedule一开始选择活动1,并将n初始化为1。然后依次检查活动i是否与当前已选择的所有活动相容。若相容则将活动i加人到已选择活动的集合a中,否则不选择活动i,而继续检查下一活动与集合a中活动的相容性。 完整程序 #includeiostream using namespace std; void sort(int f[],int n) { int temp; for(int i=1;in;i++) { for(int j=0;ji;j++) if(f[j]f[j+1]) { temp=f[j]; f[j]=f[j+1]; f[j+1]=temp; } } coutthe sort result:endl; for( i=0;in;i++) coutf[i],; coutendl; } int schedule(int s[],int f[],bool a[],int r) { int n=1; int j=0; a[0]=true; for(int i=1;ir;i++) if(s[i]=f[j]) {a[i]=true;n++;j=i;} else a[i]=false; coutthe least amount meeting place is :n; return n; } void main() { int r;//活动数 int p=0; coutplease input the activity quantityendl; cinr; coutplease input the start_timeendl; int *st=new int[r+1]; bool *a=new bool[r+1]; for(int i=0;ir;i++) cinst[i]; coutplease inputthe end_timeendl
文档评论(0)