《lab5-贪心算法设计与应用.doc》由会员分享,可在线阅读,更多相关《lab5-贪心算法设计与应用.doc(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-datelab5-贪心算法设计与应用实验六 贪心算法设计与应用实验五 贪心算法设计与应用一基本原理的概括贪心法是一种算法设计技术,通常用于求解最优化问题。通过一系列选择步骤来构造问题的解,每一步都是对当前部分解的一个扩展,直至获得问题的完整解。所做的每一步选择都必须满足: 1)可行的:必须满足问题的约束。 2)局部最优:当前所有可能的选择中最佳的局部选择。3)不可取消: 选择
2、一旦做出,在后面的步骤中就无法改变了。要注意的是,贪心法不能保证总能得到最优解(一系列的局部最优选择不能保证最后得到整体最优解)二该类算法设计与实现的要点贪心算法往往效率高,一般时间复杂性为多项式阶。贪心算法一般较简单,其关键和难点在于贪心选择策略的确定,以及证明相应的贪心算法确实可求出最优解。三实验目的和要求理解贪心算法的基本原理,掌握贪心算法设计的基本方法及其应用;四实验内容(一) 加油问题(Problem Set 1702):1. 问题描述一个旅行家想驾驶汽车从城市A到城市B(设出发时油箱是空的)。给定两个城市之间的距离dis、汽车油箱的容量c、每升汽油能行驶的距离d、沿途油站数n、油站
3、i离出发点的距离di以及该站每升汽油的价格pi,i=1,2,n。设d1=0d2dn。要花最少的油费从城市A到城市B,在每个加油站应加多少油,最少花费为多少?2. 具体要求Input输入的第一行是一个正整数k,表示测试例个数。接下来几行是k个测试例的数据,每个测试例的数据由三行组成,其中第一行含4个正整数,依次为A和B两个城市之间的距离d1、汽车油箱的容量c(以升为单位)、每升汽油能行驶的距离d2、沿途油站数n (1=n=200);第二行含n个实数d1, d2 , dn,表示各油站离出发点的距离(d1=0);第三行含n个实数p1, p2 , pn,表示各油站每升汽油的价格。同一行的数之间用一个空
4、格隔开。Output对于每个测试例输出一行,含一个实数,表示从城市到城市所要花费的最少油费(输出的结果精确到小数点后一位)。若问题无解,则输出“No Solution”。3. 代码如下:#include#define MAX 20void look(float dis,float pir,int n,int d2,int oil)/dis距离起点距离,pir油价int i,j,k;float pirce=0.0,c1=0,x,c2;for(j=0;j=n;j+)for(i=j+1;i=n;i+)if(piri=oil)x=oil-c1;elsex=c2-c1;if(x0)x=0;pirce=p
5、irce+pirj*x;break;c1=c1+x-(disj+1-disj)/d2);printf(%.1f,pirce);void main()int k,i,j,nMAX,cMAX,d1MAX,d2MAX,lengthMAX,flagMAX;float AMAXMAX,BMAXMAX;printf(输入测试例个数:n);scanf(%d,&k);for(i=0;ik;i+)printf(输入第%d个数据:n,i+1);flagi=0;scanf(%d %d %d %d,&d1i,&ci,&d2i,&ni);lengthi=ci*d2i;for(j=0;jni;j+)scanf(%f,&A
6、ij);Aini=d1i*1.0;for(j=0;j0;j-)if(Aij-Aij-1lengthi)flagi=1;if(flagi=1)printf(第%d次结果:,i+1);printf(NO solution!n);elseprintf(第%d次结果:,i+1);printf(最少油费:);look(Ai,Bi,ni,d2i,ci);printf(n);printf(n);(二) 黑白点的匹配(Problem Set 1714):1. 问题描述设平面上分布着n个白点和n个黑点,每个点用一对坐标(x, y)表示。一个黑点b=(xb,yb)支配一个白点w=(xw, yw)当且仅当xb=xw
7、和yb=yw。若黑点b支配白点w,则黑点b和白点w可匹配(可形成一个匹配对)。在一个黑点最多只能与一个白点匹配,一个白点最多只能与一个黑点匹配的前提下,求n个白点和n个黑点的最大匹配对数。2. 具体要求Input输入的第一行是一个正整数k,表示测试例个数。接下来几行是k个测试例的数据,每个测试例的数据由三行组成,其中第一行含1个正整数n(n16);第二行含2n个实数xb1, yb1,xb2, yb2, xbn, ybn, (xbi, ybi),i=1, 2, , n表示n个黑点的坐标;第三行含2n个实数xw1, yw1,xw2, yw2, xwn, ywn,(xwi, ywi),i=1, 2,
8、 , n表示n个白点的坐标。同一行的实数之间用一个空格隔开。Output对于每个测试例输出一行,含一个整数,表示n个白点和n个黑点的最大匹配对数。3. 代码如下:#include iostream.h#include math.hstruct pointdouble x,y;void sort(point *a,int n)int i,j;point p;for(i=1;i=n;i+)for(j=i+1;jaj.x|(ai.x=aj.x&(ai.yaj.y)p=ai;ai=aj;aj=p;double dis(point pointw,point pointb)double dist;dist
9、=sqrt(pow(pointb.x-pointw.x),2)+pow(pointb.y-pointw.y),2);return dist;int main()int i,j,n,k;cinn;point *pointw=new pointn;point *pointb=new pointn;int *b=new intn;for(i=1;ipointbi.x;for(i=1;ipointbi.y;for(i=1;ipointwi.x;for(i=1;ipointwi.y;sort(pointw,n);for(i=1;i=n;i+)bi=1;int count=0;for(i=1;i=n;i+)double mindis=32767;double Min=mindis;for(j=1;j=pointwi.x&pointbj.y=pointwi.y)if(mindisdis(pointwi,pointbj)mindis=dis(pointwi,pointbj);k=j;if(mindisMin)bk=0;count+;coutpointwi.x,pointwi.y & pointbk.x,pointbk.yendl;cout最大匹配数:countendl;return 0;-