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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

算法设计与分析作业三.docx

1、算法设计与分析作业三算法设计与分析实验报告学 院 信息科学与技术学院 专业班级 软件工程3班 学 号 20122668 姓 名 王建君 指导教师 尹治本 2014年10月 实验四 矩阵相乘次序1、问题提出用动态规划算法解矩阵连乘问题。给定n个矩阵A1,A2,An,其中Ai与Ai+1是可乘的,i=1,2,n-1。要算出这n个矩阵的连乘积A1A2An。由于矩阵乘法满足结合律,故计算矩阵的连乘积可以有许多不同的计算次序。这种计算次序可以用加括号的方式来确定。若一个矩阵连乘积的计算次序完全确定,也就是说该连乘积已完全加括号,则可以依此次序反复调用2个矩阵相乘的标准算法计算出矩阵连乘积。完全加括号的矩阵

2、连乘积可递归地定义为: (1)单个矩阵是完全加括号的; (2)矩阵连乘积A是完全加括号的,则A可表示为2个完全加括号的矩阵连乘积B和C的乘积并加括号,即A=(BC)。 例如,矩阵连乘积A1A2A3A4有5种不同的完全加括号的方式:(A1(A2(A3A4),(A1(A2A3)A4),(A1A2)(A3A4),(A1(A2A3)A4),(A1A2)A3)A4)。每一种完全加括号的方式对应于一个矩阵连乘积的计算次序,这决定着作乘积所需要的计算量。若A是一个pq矩阵,B是一个qr矩阵,则计算其乘积C=AB的标准算法中,需要进行pqr次数乘。 (3)为了说明在计算矩阵连乘积时,加括号方式对整个计算量的影

3、响,先考察3个矩阵A1,A2,A3连乘的情况。设这三个矩阵的维数分别为10100,1005,550。加括号的方式只有两种:(A1A2)A3),(A1(A2A3),第一种方式需要的数乘次数为101005105507500,第二种方式需要的数乘次数为100550101005075000。第二种加括号方式的计算量时第一种方式计算量的10倍。由此可见,在计算矩阵连乘积时,加括号方式,即计算次序对计算量有很大的影响。于是,自然提出矩阵连乘积的最优计算次序问题,即对于给定的相继n个矩阵A1,A2,An(其中矩阵Ai的维数为pi-1pi,i1,2,n),如何确定计算矩阵连乘积A1A2An的计算次序(完全加括

4、号方式),使得依此次序计算矩阵连乘积需要的数乘次数最少。2、求解思路本实验采用动态规划算法解矩阵连乘积的最优计算次序问题。本实验的算法思路是: 1)计算最优值算法MatrixChain():建立两张表(即程序中的*m和*s,利用二维指针存放),一张表存储矩阵相乘的最小运算量,主对角线上的值为0,依次求2个矩阵、3个矩阵、直到n个矩阵相乘的最小运算量,其中每次矩阵相乘的最小运算量都在上一次矩阵相乘的最小运算量的基础上求得,最后一次求得的值即为n个矩阵相乘的最小运算量;另一张表存储最优断开位置。 2)输出矩阵结合方式算法Traceback():矩阵结合即是给矩阵加括号,打印出矩阵结合方式,由递归过

5、程Traceback()完成。分三种情况: (1)只有一个矩阵,则只需打印出A1; (2)有两个矩阵,则需打印出(A1A2); (3)对于矩阵数目大于2,则应该调用递归过程Traceback()两次,构造出最优加括号方式。 三、算法复杂度 该算法时间复杂度最高为。4、实验源代码#include using namespace std; const int MAX = 100; /p用来记录矩阵的行列,main函数中有说明 /mij用来记录第i个矩阵至第j个矩阵的最优解 /s用来记录从哪里断开的才可得到该最优解 int pMAX+1,mMAXMAX,sMAXMAX; int n;/矩阵个数 in

6、t matrixChain() for(int i=0;i=n;i+) mii=0; for(int r=2;r=n;r+)/对角线循环 for(int i=0;i=n-r;i+)/行循环 int j = r+i-1;/列的控制 /找mij的最小值,先初始化一下,令k=i mij=mi+1j+pi+1*pi*pj +1; sij=i; /k从i+1到j-1循环找mij的最小值 for(int k = i+1;kj;k+) int temp=mik+mk+1j+pi*pk+1*pj+1; if(tempmij) mij=temp; /s用来记录在子序列i-j段中,在k位置处 /断开能得到最优解

7、sij=k; return m0n-1; /根据s记录的各个子段的最优解,将其输出 void traceback(int i,int j) if(i=j) coutAi; return; if(isij) cout(; traceback(i,sij); if(isij) cout); if(sij+1j) cout(; traceback(sij+1,j); if(sij+1j) cout); void traceback() cout(; traceback(0,n-1); cout); coutendl; int main() system(title 软件3班 王建君 20122668

8、 动态规划求矩阵连乘次序); cout请输入矩阵的个数:n; cout输入矩阵(形如a*b,中间用空格隔开):endl; for(int i=0;ipi; /测试数据可以设为8个矩阵分别为 /A110*15,A215*20,A320*5,A45*25,A525*20,A620*5,A75*23,A823,8 /则p0-8=10,15,20,5,25,20,5,23,8 cout输出结果如下:endl; matrixChain(); traceback(0,n-1); /最终解值为m0n-1; coutendl; return 0; 5、结果分析测试数据可以设为8个矩阵分别为 /A010*15,

9、A115*20,A220*5,A35*25,A425*20,A520*5,A65*23,A723,8 则p0-8=10,15,20,5,25,20,5,23,8,的最佳相乘次序为(A0(A1A2)(A3A4)A5)(A6A7)。 实验五、找零问题1、问题提出 设有n种不同面值的硬币,各硬币的面值存于数组t1:n中。现要用这些面值的硬币来找钱,可以实用的各种面值的硬币个数不限。当只用硬币面值t1,t2,ti时,可找出钱数M的最少硬币个数记为bij。若只用这些硬币面值,找不出钱数M时,记bij=。2、求解思路 令bi,j表示前i(1im)种硬币,总额为j(0jn)的最小硬币数。目标为求bm,n。由

10、于对第i种硬币,存在可选1个或者不选两种可能,故容易建立递推关系:bi,jmin bi-1,j, 1+bi,j-vi, for 1im, 0jn显然,bi,0=0, 1im如果无解,令bi,j=+。特别的,如果i=1,令b-1,j=+;如果j-vi0,bi,j-vi=+3、算法复杂度n-钞票面额的个数 M-要找的钱数,子问题不重复计算,时间复杂度降低,时间复杂度O(nM)。4、实验源代码#include #include #define INFINITY 32767 /无穷大#define MAX 100/*bij=-1 子问题未计算,递归计算 bij!=-1 子问题已计算,直接取计算结果 另

11、外,也可从bij算出各种面额的钞票数*/int DynamicMemory(int t, int i ,int j,int bMAX) if(i=1) if(j%t1=0) bij=j/t1; else bij=INFINITY; return bij; else int x; if(bi-1j=-1) x=DynamicMemory(t,i-1,j,b); else x=bi-1j; if(jy+1)?(y+1):x; return bij; void main() system(title 软件3班 王建君 20122668 动态规划实现找零问题); int t10,n,M;/n-钞票面额的个数 M-要找的钱数 t0=0; printf(请输入钞票面额的种数:n); scanf(%d,&n); printf(请依次输入%d种钞票的面额:n,n); for(int i=1;i=n;i+) scanf(%d,&ti); printf(请输入要找零的钱的总数:n); scanf(%d,&M); int bMAXMAX; int pMAX=0; for(i=0;iMAX;i+) for(int j=0;j0) if(r=1;k-) if(pk!=0) printf(面额为%d的钞票数:%dn,tk,pk); 5、结果分析

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

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