ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:235.14KB ,
资源ID:18203418      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/18203418.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(实验四 回溯算法和分支限界法Word格式.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

实验四 回溯算法和分支限界法Word格式.docx

1、个三角形:endl; for (int i=1;i=n;i+) for (int j=1;ji;j+) ; for (j=1;=n-i+1;chpij else for (int i=0;=1; p1t=i; /确定第一行第t个的值; count+=i; /用来计算-的个数; for (int j=2;=t; pjt-j+1=pj-1t-j+1pj-1t-j+2; /对于第一行大于等于2时确定后面从第2行开始增加的一 count+=pjt-j+1; /列中符号,计算-个数; if (count = half & (t*(t+1)/2-count) n; count=0; sum=0; half

2、=n*(n+1)/2; if (half%2=0) half=half/2; p=new uchar* n+1; pi=new ucharn+1; memset(pi,0,sizeof(uchar)*(n+1); BackTrace(1); for (i=0; delete pi; delete p;满足要求的三角形符号共有:个不存在这样的三角形符号!运行结果:分析:计算可行性约束需要O(n)时间,在最坏情况下有 O(2n)个结点需要计算可行性约束,故解符号三角形问题的回溯算法所需的计算时间为 O(n2n)。基本题二:01背包问题1、掌握01背包问题的回溯算法;2、进一步掌握回溯算法;二、实验

3、题:给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大?#includeint n,c,bestp;/物品的个数,背包的容量,最大价值int p10000,w10000,x10000,bestx10000;/物品的价值,物品的重量,xi暂存物品的选中情况,物品的选中情况void Backtrack(int i,int cp,int cw) /cw当前包内物品重量,cp当前包内物品价值 int j; if(in)/回溯结束 if(cpbestp) bestp=cp; for(i=0;i+) bestxi=xi; el

4、se for(j=0;j+) xi=j; if(cw+xi*wi/-宏定义- #define MAX_CITY_NUMBER 10 /城市最大数目 #define MAX_COST 10000000 /两个城市之间费用的最大值 /-全局变量- int City_GraphMAX_CITY_NUMBERMAX_CITY_NUMBER; /表示城市间边权重的数组 int City_Size; /表示实际输入的城市数目 int Best_Cost; /最小费用 int Best_Cost_PathMAX_CITY_NUMBER; /最小费用时的路径 /-定义结点- typedef struct No

5、de int lcost; /优先级 int cc; /当前费用 int rcost; /剩余所有结点的最小出边费用的和 int s; /当前结点的深度,也就是它在解数组中的索引位置 int xMAX_CITY_NUMBER; /当前结点对应的路径 struct Node* pNext; /指向下一个结点 Node;/-定义堆和相关对操作- typedef struct MiniHeap Node* pHead; /堆的头 MiniHeap;/初始化 void InitMiniHeap(MiniHeap* pMiniHeap) pMiniHeap-pHead = new Node;pHead-

6、pNext = NULL; /入堆 void put(MiniHeap* pMiniHeap,Node node) Node* next; Node* pre; Node* pinnode = new Node; /将传进来的结点信息copy一份保存 /这样在函数外部对node的修改就不会影响到堆了 pinnode-cc = node.cc;lcost = node.lcost;pNext = node.pNext;rcost = node.rcost;s = node.s; for(int k=0;kpHead; next = pMiniHeap-pNext; if(next = NULL)

7、 pNext = pinnode; else while(next != NULL) if(next-lcost) (pinnode-lcost) /发现一个优先级大的,则置于其前面 pNext = pre- pre- break; /跳出 pre = next; next = next- /放在末尾 /出堆 Node* RemoveMiniHeap(MiniHeap* pMiniHeap) Node* pnode = NULL; if(pMiniHeap-pNext ! pnode = pMiniHeap-pNext = pMiniHeap-pNext- return pnode;/-分支限

8、界法找最优解- void Traveler() int i,j; int temp_xMAX_CITY_NUMBER; Node* pNode = NULL; int miniSum; /所有结点最小出边的费用和 int miniOutMAX_CITY_NUMBER; /保存每个结点的最小出边的索引 MiniHeap* heap = new MiniHeap; /分配堆 InitMiniHeap(heap); /初始化堆 miniSum = 0;i+) miniOuti = MAX_COST; /初始化时每一个结点都不可达 j+) if (City_Graphij0 & City_Graphi

9、jlcost = 0; /当前结点的优先权为0 也就是最优 cc = 0; /当前费用为0(还没有开始旅行) rcost = miniSum; /剩余所有结点的最小出边费用和就是初始化的miniSum s = 0; /层次为0 xk = Best_Cost_Pathk; /第一个结点所保存的路径也就是初始化的路径 put(heap,*pNode); /入堆 while(pNode != NULL & (pNode-s) xk ; /将最优路径置换为当前结点本身所保存的 /* * * pNode 结点保存的路径中的含有这条路径上所有结点的索引 * * x路径中保存的这一层结点的编号就是xCity

10、_Size-2 * * 下一层结点的编号就是xCity_Size-1 */ if (pNode-s) = City_Size-2) /是叶子的父亲 int edge1 = City_Graph(pNode-x)City_Size-2(pNode-x)City_Size-1; int edge2 = City_Graph(pNode-x)City_Size-1(pNode-x)0; if(edge1 = 0 & edge2 cc+edge1+edge2) cc + edge1+edge2;cc = Best_Cost;lcost = Best_Cost; /优先权为 Best_Cost s+;

11、/到达叶子层 else /内部结点 for (i=pNode-s;i+) /从当前层到叶子层 if(City_GraphpNode-xpNode-spNode-xi = 0) /可达 /pNode的层数就是它在最优路径中的位置 int temp_cc = pNode-cc+City_GraphpNode-xi; int temp_rcost = pNode-rcost-miniOutpNode-s; /下一个结点的剩余最小出边费用和 /等于当前结点的rcost减去当前这个结点的最小出边费用 if (temp_cc+temp_rcosts+1 = Best_Cost_Pathi; /将当前结点的

12、编号放入路径的深度为s+1的地方 temp_xi = Best_Cost_PathpNode-s+1; /将原路/径中的深度为s+1的结点编号放入当前路径的 /相当于将原路径中的的深度为i的结点与深度W为s+1的结点交换 Node* pNextNode = new Node; pNextNode-cc = temp_cc;lcost = temp_cc+temp_rcost;rcost = temp_rcost;s = pNode-s+1;xk = temp_xk; put(heap,*pNextNode); delete pNextNode; pNode = RemoveMiniHeap(h

13、eap);int main() 请输入旅行的节点数City_Size);请分别输入每个节点与其它节点的路程花费City_Graphij); Traveler();最小花费,Best_Cost); return 1;提高题二:用回溯法求解跳马问题一、实验要求与目的1、掌握回溯法的基本原理。2、使用回溯法编程,求解跳马问题二、实验内容1、问题描述:在N*N棋盘上有N2个格子,马在初始位置(X0,Y0),按照象棋中马走“日”的规则,使马走遍全部格子且每个格子仅经过一次。编程输出马的走法。2、给出算法描述。编程实现,给出N=5,(X0,Y0)=(1,1)时的运行结果。class Tiaomapubli

14、c: int N; int x; int y; int A; int Count; int Map66; Tiaoma(int n,int x,int y):N(n),x(x),y(y)A=1;Count=1; void Horse(int x,int y); void Print(); void Roud();void Tiaoma:Horse(int x,int y) if(1=x-2&y+1=N&Mapx-2y+1=0) Mapx-2y+1=+A; Count+; Horse(x-2,y+1);=x-1&y+2Mapx-1y+2=0) Mapx-1y+2=+A; Horse(x-1,y+

15、2); if(x+1Mapx+1y+2=0) Mapx+1y+2=+A; Horse(x+1,y+2); if(x+2Mapx+2y+1=0) Mapx+2y+1=+A; Horse(x+2,y+1);1=y-1&Mapx+2y-1=0) Mapx+2y-1=+A; Horse(x+2,y-1);=y-2&Mapx+1y-2=0) Mapx+1y-2=+A; Horse(x+1,y-2);Mapx-1y-2=0) Mapx-1y-2=+A; Horse(x-1,y-2);Mapx-2y-1=0) Mapx-2y-1=+A; Horse(x-2,y-1);Print()t for(int i1=1;i1=N;i1+)列 for(int i=1;行 for(int j=1;MapijRoud()跳马路线为: int s=1; for(;s=Count;) for(int l=1;l if(s%7=0) s+; else if(Maplk=s&s=C

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1