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