贪心算法和随机法 第五章 试验报告.docVIP

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
贪心算法和随机法 第五章 试验报告

实验报告 实验目的: 理解和掌握贪心算法和随机算法的思想。 实验内容:通过解决几个实际例子,来理解和加深对贪心算法以及随机算法的应用。 实验过程: 1.背包问题 1.1问题描述 有一个背包,背包的容量是150。有7个物品,物品可以分割成任意大小。要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。 1.2算法分析 因为物品可以任意分割,所以可以计算每件物品的单位质量的价值,然后从大到小排序,然后从序列中价值最高的第一个物品开始选起,在保证载容范围内,直到装不下第i个整个物品时, 则计算余留空间的容量,得到此物体应分割多少装进去。 1.3程序框图 物品 A B C D E F G 重量 35 30 60 50 40 10 25 价值 10 40 30 50 35 40 30 单位价值 0.28574 1.33333 0.50000 1.00000 0.87500 4.00000 1.20000 顺序 7 2 6 4 5 1 3 装入的物品为:F(10),B(30),G(25),D(50),E(35) 40 + 40 + 30 + 50+ 0.875*35=190.63 1.4程序源代码 //----------背包问题 #includestdio.h #define N 7 #define C 150 float weight[7]; float value[7]; float pervalue[7]; int n,a[7]; float max=0; void readdata() { int i; for(i=0;iN;i++) scanf(%f,weight[i]); for(i=0;iN;i++) scanf(%f,value[i]); for(i=0;iN;i++) { pervalue[i]=value[i]/weight[i]; // printf(%f ,pervalue[i]); } for(i=0;iN;i++) a[i]=i; } void sort() { int i,j,t; for(i=0;iN;i++) { for(j=i+1;jN;j++) if(pervalue[j]pervalue[a[i]]) { t=a[i];a[i]=a[j];a[j]=t;} } } float search() { int i,j; float con,val; for(i=0;iN;i++) { con=weight[a[i]]; val=value[a[i]]; for(j=i+1;jN;j++) if(weight[a[j]](C-con)) { con+=weight[a[j]]; val+=value[a[j]]; } else { val=val+(pervalue[a[j]])*(150-con); con=150; } if(maxval) max=val; } // printf(\n%f,max); return (max); } void main() { int i; float v; scanf(%d,n); for(i=0;in;i++) { max=0; readdata(); sort(); v=search(); printf(%.2f\n,v); } } 2. 照亮的山景 2.1问题描述 在一片山的上空,高度为T处有N个处于不同位置的灯泡,如图。如果山的边界上某一点于某灯i的连线不经过山的其它点,我们称灯i可以照亮该点。开尽量少的灯,使得整个山景都被照亮。山被表示成有m个转折点的折线。 2.2算法思想 照亮整个山景相当于照亮每一个转折点。 可对每个凹点画向上方的延长线,交于高度线,从而得到每一个凹点被照到时灯所放置的范围区间,然后以每个区间的后端点由小到大排序。然后对于排好序的区间,检查其后点所能同时找到的区间,并标记。知道所有的区间都被标记完,即说明所有的凹点被照到,也就是整个山景被照亮。 2.3程序框图 1 3 2 2.4程序源代码 #include stdio.h int M,N; int b[100]; float left,right,x[100],y[100],qian[50],hou[50],top=40.0; void readdata() { int i; printf(输入折点的个数:);

文档评论(0)

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

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

1亿VIP精品文档

相关文档