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

  • 2
  • 0
  • 约4.44千字
  • 约 7页
  • 2016-12-06 发布于北京
  • 举报

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

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

实验报告 实验目的: 理解和掌握贪心算法和随机算法的思想。 实验内容:通过解决几个实际例子,来理解和加深对贪心算法以及随机算法的应用。 实验过程: 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)

1亿VIP精品文档

相关文档