版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、模型与算法四道题及“跳棋思考题1、找零钱思想:先找零25分的,然后再依次满足10分、5、1.算法:符号说明:Sumi:消费金额.Sleft2:找零金额.XI、X2、X3X4:需要找零25分、10分、5分和1分的数量.S1:请输入小于100分的消费金额:Sum10S2:需要找零白金额为:Sleft2=100-Sum1X3=(Sleft2-25*S3:计算与赋值:X1=Sleft2/25、X2=(Sleft2-25*X1)/10、X1-10*X2)/5、X4=Sleft2-25*X1-10*X2-5*X3.S4输出X1、X2、X3、X4的CpplcppVinQliiidCnath.h>yoi
2、iimim(>41nitsall9dati;Int匕1叶42人工心;pHntK糙小人小于1吩的满兽金邮FThEMF("ti"v&5al);£i*ft«3-|D«-Eail;叫叫-a响m:0/25);slelt1-5left|0J-2S*kL(sJ;x1-i»b5<5left11/18);l1-1ft»x1;xl3-51e(t2JPinE'需要找零招小1叨J分一工史越重分别彻,由prints,'觐个,1;巧、5尸【叫户h?户打心2、带有时间窗的任务分配算法?:还未被分配的任务集合.?:已经被
3、分配的任务集合.A:临时集合.S1赋值k=1oS2:从?余中找出一个开始时间最小的任务i,并输出:“任务i分配到第k个机器“,并且?=?比i,?余=?-i.S3:判断A=i?|?i?>?j?a是否为空集,假设A为空集,那么此机器已经满了,k=k+1,?=?,进入S4;否那么从A中选出一个开始时间最小的任务i,并输出:“任务i分配到第k个机器“,并Z=?aUi,?集=?-i,进入S3S4:乎U断条是否为空集,假设是,程序结束;否那么进入S3D:O43rlDrbugCpp2#include<stdio.h>voidmain()(chara7='a','b&
4、#39;,'c','d','e','f,'g'charb;charx7;ints7=0,3,4,9,7,1,6;intf8=2,7,7,11,10,5,8,0;inti,j,k,n,m,c,d,x1,x2,x3,x4;booly1,y2;k=0;m=1;for(i=0;i<7;i+)/将任务按开始时间从小到大排序.for(j=i;j<7;j+)if(si>sj)c=si;si=sj;sj=c;d=fi;fi=fj;fj=d;b=ai;ai=aj;aj=b;)x0=0;n=0;doprintf("
5、安排在第%d台机器上的任务有:",m);if(m=1)printf("%c",a0);for(i=1;i<7;i+)y2=1;for(j=0;j<k;j+)y1=(i!=xj)&&y2;/保证即将安排的任务是未被分配的.y2=y1;)if(y1)if(si>=fn)/保证即将安排的任务开始时间不得小于前一个任务的结束时间.k=k+1;xk=i;n=xk;printf("%c",ai);)if(i=6)n=8;)printf("n");+m;while(k<6);)3、01背包问题启发式
6、算法(回溯法):给定n中物品和一个背包,假设物品i的重量wi,其价值为vi,背包容量为Co物品i有两种状态,装入背包或者不装入背包.X=0时表示物品i不装入背包,X=1时表示物品装入背包,那么决策物品是否装入背包的问题转化为一个二叉树搜索问题,根据约束条件进行剪枝,然后结合回溯法求出解.所给物品根据单位价值量进行非增排序,解空间表示为集合S=X,X2,./凶以./,i=1,2;n,如何选择物品装入背包,使得包内物品的总价值最大的算法如下:Step1:从根节点开始,计算此时背包的剩余容量和背包中物品的价值;此时根节点为活结点,也是当前的扩展结点.Step2:以深度优先方式搜索,从当前的一个扩展结
7、点向纵深方向移至一个新的结点,此时这根结点成为活结点并成为当前扩展结点.计算此时背包的剩余容量,并计算背包中物品的价值;Step3:根据约束条件判断当前的扩展结点是否可以再向纵深方向移动;Step4:如果满足约束条件那么向纵深方向移至新节点,否那么回溯至最近的活结点,使其成为当前扩展结点;Step5:"专step2,直到找出最优解或者解空间中没有活结点;Step6:算法结束.0-1背包问题的邻域搜索算法:Stepl:根据约束条件给出一个可行解Sd,并计算初始可行解时装入背包中物品的价值Vo;Step2:利用贪心算法构造领域函数,将单位价值量大的物品替换初始可行解中的单位价值量小的物品
8、;Step3:计算新解Si时,背包中物品的价值Vi,假设Vi>Vo,那么S0=S,Vo=Vi;Step4:转Stepi,直到算出最优解或者满意解为止;Step5:算法结束.例子:假设n=6,i=1,2.r6W=9,7,5,13,8,6,V=4,3,2,5,3,21,C=24;利用邻域搜索算算法求解时:Stepi:首先给出初始可行解?=1,1,1,0,0,0,此时=9;Step2:通过邻域搜索用=1,1,0,0,1,0替换SdoStep3:计算Vi=10,Vi>Vo,那么So=S,Vo=Vi;Step4:车专Stepi,直到算出最优解或者满意解为止;Step5:算法结束.4、写出网络
9、图中寻找V1至Vn的路径的算法Stepi:用Wij表示图中两点Vi与Vj之间的距离,假设V与M之间没有连线,%?+°°显然可令图中每个顶点?00Step2:给起点Vi标上固定的标号P(?)=0,并打上*号.给其它各点标上临时标号,如起点到该点有边直接相连,就标T(?)=?否那么T(?=+oo0Step3:在所有T标号中选取最小的,将其改为P标号,并重新计算有T标号的其它各点的T标号.Step4:"Sstep3,直至所有的顶点得到P标号为止.Step5:算法结束.5、独立砖石跳棋问题题目:图中33个顶点摆着32枚棋子,仅中央的顶点空着未摆放棋子.下棋的规那么是任一棋
10、子可以沿水平或垂直方向跳过与其相邻的棋子,进入空着的顶点并吃掉被跳过的棋子.试设计一个算法找出一种下棋方法,使得最终棋盘上只剩下一个棋子在棋盘中央.解:回溯法的根本思想是:在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树,算法搜索至解空间树的任意一点时,先判断该结点是否包含问题的解,如果肯定不包含,跳过对该结点为根的子树的搜索,逐层向其祖先结点回溯;否那么,进入该子树,继续按深度优先策略搜索.简而言之就是从某一可行解开始进行,能进那么进,不进那么退至上一步,换一可行路径再试.此题中用回溯的思想,如果两个子之间能跳,那么跳了之后记录其新的位置,由于跳的前后都是一个问题,所以我们能用递
11、归分治,跳了一次之后棋子数减一,并把跳过的棋子和编号最后的棋子交换,这样就到达了把棋子去掉的目的,并把最优解保存.把棋盘上的位置规定成一个二维数组,如下图:#include<iostream>#include<fstream>usingnamespacestd;structstep/记录移动棋子的信息(intsx,sy;/记录移动棋子前棋子的位置inttx,ty;/记录移动棋子后棋子的位置intdir;/dir值代表移动棋子的方向structstepmystack100,last_step;chardiamond77;intLeft_diamond=32;intx,y,
12、nx,ny,ndir,top;/ndir值代表方向,0向右,1向下,2向左,3向上intflag=1;/是否成功找到解的标志/初始化棋盘voidInit_diamond()(for(inti=0;i<7;i+)(for(intj=0;j<7;j+)(if(i<2|i>4)&&(j<2|j>4);else(diamondij='*')diamond33='.')/移动棋子intMove_diamond(inty,intx,intdir)(if(diamondyx!='*')return0;stru
13、ctsteptemp;switch(dir)case0:if(x+2>6|diamondyx+1!='*'|diamondyx+2!='.')return0;diamondyx=diamondyx+1='.'diamondyx+2='*'temp.sx=x;temp.sy=y;temp.tx=x+2;temp.ty=y;temp.dir=dir;mystacktop+=temp;return1;break;case 1:if(y+2>6|diamondy+1x!='*'|diamondy+2x!=
14、9;.')return0;diamondyx=diamondy+1x='.'diamondy+2x='*'temp.sx=x;temp.sy=y;temp.tx=x;temp.ty=y+2;temp.dir=dir;mystacktop+=temp;return1;break;case 2:(if(x-2<0|diamondyx-1!='*'|diamondyx-2!='.')return0;diamondyx=diamondyx-1='.'diamondyx-2='*'temp.sx
15、=x;temp.sy=y;temp.tx=x-2;temp.ty=y;temp.dir=dir;mystacktop+=temp;return1;break;case 3:if(y-2<0|diamondy-1x!='*'|diamondy-2x!='.')return0;diamondyx=diamondy-1x='.'diamondy-2x='*'temp.sx=x;temp.sy=y;temp.tx=x;temp.ty=y-2;temp.dir=dir;mystacktop+=temp;return1;break;de
16、fault:break;return0;/主函数voidmain()answer.txt/输出一个解到文本文件ofstreamanswer("answer.txt");Init_diamond();top=nx=ny=ndir=0;while(1)/回溯遍历,直到找到一个解if(Left_diamond=1&&diamond33='*')break;for(y=ny;y<7;y+,nx=0)for(x=nx;x<7;x+,ndir=0)for(intdir=ndir;dir<4;dir+)if(Move_diamond(y,
17、x,dir)Left_diamond-;nx=ny=ndir=0;gotonextstep;nextstep:if(y=7)top-;if(top>=0)/回到上一步,并改变方向last_step=mystacktop;diamond(last_step.sy+last_step.ty)/2(last_step.sx+last_step.tx)/2='*'diamondlast_step.sylast_step.sx='*'diamondlast_step.tylast_step.tx='.'nx=last_step.sx;ny=last_
18、step.sy;ndir=last_step.dir+1;Left_diamond+;elseanswer<<"Can'tfindanyanswer,Iamsorry."<<endl;cout<<"Can'tfindanyanswer,Iamsorry."<<endl;flag=0;break;)Init_diamond();answer<<"Theinitializationdiamondstates:"<<endl;for(inti=0;i<7;i+)for(intj=0;j<7;j+)answer<<diamondij<<''answer<<endl;answer<<endl<<endl;for(intn=0;n<top;n+)/输出解answer<<"step"<<n+1<<":Movediamond("<<mystackn.sy+1<<,"
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 体检科主任先进事迹(7篇)
- 二级职称专业技术工作总结(5篇)
- 企业举办年会总结主持词结束语
- DB12T 487-2013 放射性同位素与射线装置安全使用管理制度编制规范
- 书香校园演讲稿模板九篇
- 中考前国旗下讲话稿
- 个人师德师风剖析材料范文(6篇)
- 与感恩同行演讲稿锦集六篇
- DB12∕T 1048-2021 蚯蚓养殖技术规程
- 验光技术课件教学课件
- (完整版)译林版四年级上册Unit7单元测试
- 水上作业危险源辨识与技术控制措施
- 吊索具检查记录表
- 商务接待申请表
- 最新少先队基础知识竞赛题库(含答案)
- 卫生院在全院实行工作日午间禁酒的规定
- 蓝色卡通幼儿园关爱眼睛主题班会
- XX镇 2022年度温室大棚项目可研报告范本
- 各种能源排放因子
- 船体结构介绍课件
- 鼻腔冲洗专业知识讲座课件
评论
0/150
提交评论