- 1、本文档共19页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
算法实验报告ghb.
计算机算法设计实验报告一.分治法:MAX-MIN算法41.问题描述42.分治策略思想设计43.具体源代码如下44.运行结果如下6二.动态规划:矩阵连乘61.问题描述62.递归方程63.具体代码如下64.运行结果9三.贪心法:背包问题91.问题描述92.贪心策略:103.具体代码如下104.运行结果:12四.贪心法:装载问题121.问题描述123.运行结果:16五.回溯法:N皇后问题161.问题描述162.递归法163,。迭代法18一.分治法:MAX-MIN算法问题描述:在含有n个元素的集合中同时找出它的最大元素和最小元素。分治策略思想设计:将任一实例I=(n,A(1),…,A(n))分成两个实例取: MAX1、MIN1 MAX2、 MIN2{……………. } {…..……….. }MAXMIN 如果MAX1和MIN1是I1中的最大和最小元素,MAX2和 MIN2是I2中的最大和最小元素, MAX1和MAX2中的大者就是I中的最大元素MAX, MIN1和MIN2中的小者是I中的最小元素MIN。如果I只包含一个元素,则不需要作任何分割直接就可得到其解。具体源代码如下: #include iostreamusing namespace std;int Max_Min(int i,int j,int Max,int Min);int A[9]={2,34,5,1,-5,100,1000,-100,19}; int Max=0,Min=0;int count=0;int main(int argc, char *argv[]){ Max_Min(0,8,Max,Min);coutMAX:Maxendl;coutMIN:Minendl;return 0;}int Max_Min(int i,int j,int Max,int Min){if(i==j)Max=Min=A[i];if(i==j-1){if(A[i]=A[j]){ Min=A[i]; Max=A[j];}else {Min=A[j]; Max=A[i];}}if(ij-1){int Mid=(i+j)/2;int Max1,Max2,Min1,Min2;count++;Max_Min(i,Mid,Max1,Min1);Max_Min(Mid+1,j,Max2,Min2);if(Min1=Min2)Min=Min1;else Min=Min2;if(Max1Max2)Max=Max1;else Max=Max2;}}运行结果如下: A[9]={2,34,5,1,-5,100,1000,-100,19}; 二.动态规划:矩阵连乘问题描述:给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。递归方程:具体代码如下: #includeiostream using namespace std; const int MAX = 100; //p用来记录矩阵的行列,main函数中有说明 //m[i][j]用来记录第i个矩阵至第j个矩阵的最优解 //s[][]用来记录从哪里断开的才可得到该最优解 int p[MAX+1],m[MAX][MAX],s[MAX][MAX]; int n;//矩阵个数 int matrixChain(){for(int i=0;i=n;i++)m[i][i]=0;for(int r=2;r=n;r++) //对角线循环for(int i=0;i=n-r;i++){ //行循环int j = r+i-1;//列的控制 //找m[i][j]的最小值,先初始化一下,令k=i m[i][j]=m[i+1][j]+p[i+1]*p[i]*p[j +1]; s[i][j]=i; //k从i+1到j-1循环找m[i][j]的最小值 for(int k = i+1;kj;k++){ int temp=m[i][k]+m[k+1][j]+p[i]*p[k+1]*p[j+1]; if(tempm[i][j]){ m[i][j]=temp; //s[][]用来记录在子序列i-j段中,在k位置处 //断开能得到最优解 s[i][j]=k; } } } return m[0][n-1];//最终结果 } //根据s[][]记录的各个子段的最优解,将其输出void traceback(int i,int j){ if(i==j){ coutAi; return ; } if(is[i][j]) cout(; traceback(i,
文档评论(0)