实验四实验汇报.docVIP

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
1、N皇后问题 实验目的: 掌握回溯法算法复杂性分析方法分析问题复杂性。 掌握回溯法的基本思想方法;理解回溯法的基本思想,理解回溯法算法的两个基本要素最优子结构性质和子问题的重叠性质。熟练掌握典型的回溯法问题。 问题描述: N皇后问题(含八皇后问题的扩展,规则同八皇后):在N*N的棋盘上,放置N个皇后,要求每一横行每一列,每一对角线上均只能放置一个皇后,求解可能的方案及方案数。 用回溯法求解,求解思路如下: 初始时,令解向量X为空,然后,从根结点出发,选择S1的第一个元素作为解向量X的第一个分量,即x1=a11,如果X=(x1)是问题的部分解,则继续扩展解向量X,选择S2的第一个元素作为解向量X的第2个分量,否则,选择S1的下一个元素作为解向量X的第一个分量,即x1=a12。依此类推,一般情况下,如果X=(x1,x2,…,xi)是问题的部分解,则选择Si+1的第一个元素作为解向量X的第i+1个分量时,有下面三种情况: (1)如果X=(x1,x2,…,xi+1)是问题的最终解,则输出这个解。如果问题只希望得到一个解,则结束搜索,否则继续搜索其他解; (2)如果X=(x1,x2,…,xi+1)是问题的部分解,则继续构造解向量的下一个分量; (3)如果X=(x1,x2,…,xi+1)既不是问题的部分解也不是问题的最终解,则存在下面两种情况: ①如果xi+1=ai+1,k不是集合Si+1的最后一个元素,则令xi+1=ai+1,k+1,即选择Si+1的下一个元素作为解向量X的第i+1个分量; ②如果xi+1=ai+1,k是集合Si+1的最后一个元素,就回溯到X=(x1,x2,…,xi),选择Si的下一个元素作为解向量X的第i个分量,假设xi=aik,如果aik不是集合Si的最后一个元素,则令xi=ai,k+1;否则,就继续回溯到X=(x1,x2,…,xi-1); 实验代码: #includeiostream using namespace std; class Queen { friend int nQueen(int); private: bool Place(int k); void Backtract(int t); int n,*x; long sum; //可行方案数 }; bool Queen::Place(int k) { for(int j=1;jk;j++) if((abs(k-j)==abs(x[j]-x[k]))||(x[j]==x[k])) return false; return true; } void Queen::Backtract(int t) { if (tn) { sum++; cout第sum种方法:; for(int i=1;i=n;i++) coutx[i] ; coutendl; } else { for(int i=1;i=n;i++) { x[t]=i; if(Place(t)) Backtract(t+1); } } } int nQueen(int n) { Queen X; X.n=n; X.sum=0; int *p=new int[n+1]; for(int i=0;i=n;i++) p[i]=0; X.x=p; X.Backtract(1); delete []p; return X.sum; } void main() { int n,m; cout请输入皇后个数:; cinn; m=nQueen(n); coutendl; cout有m种可行方法endl; } 实验结果: 2. 0-1背包问题 问题描述: 给定n种物品和一背包。物品i的重量是wi0,其价值为vi0,背包的容量为c。问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大? 利用回溯法试设计一个算法求出0-1背包问题的解,也就是求出一个解向量xi (xi = 0 或1,xi = 0表示物体i不放入背包,xi =1表示把物体i放入背包)。 解题思路: 初始时,令解向量X为空,然后,从根结点出发,选择S1的第一个元素作为解向量X的第一个分量,即x1=a11,如果X=(x1)是问题的部分解,则继续扩展解向量X,选择S2的第一个元素作为解向量X的第2个分量,否则,选择S1的下一个元素作为解向量X的第一个分量,即x1=a12。依此类推,一般情况下,如果X=(x1,x2,…,xi)是问题的部分解,则选择Si+1的第一个元素作为解向量X的第i+1个分量时,有下面三种情况: (1)如果X=(x1,x2,…,xi+1)是问题的最终解,则输出这个解。

文档评论(0)

wuyoujun92 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档