电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本
换一换
首页 金锄头文库 > 资源分类 > DOC文档下载
分享到微信 分享到微博 分享到QQ空间

算法设计与分析P3_4

  • 资源ID:114683691       资源大小:64.37KB        全文页数:9页
  • 资源格式: DOC        下载积分:20金贝
快捷下载 游客一键下载
账号登录下载
微信登录下载
三方登录下载: 微信开放平台登录   支付宝登录   QQ登录  
二维码
微信扫一扫登录
下载资源需要20金贝
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
如填写123,账号就是123,密码也是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

 
账号:
密码:
验证码:   换一换
  忘记密码?
    
1、金锄头文库是“C2C”交易模式,即卖家上传的文档直接由买家下载,本站只是中间服务平台,本站所有文档下载所得的收益全部归上传人(卖家)所有,作为网络服务商,若您的权利被侵害请及时联系右侧客服;
2、如你看到网页展示的文档有jinchutou.com水印,是因预览和防盗链等技术需要对部份页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有jinchutou.com水印标识,下载后原文更清晰;
3、所有的PPT和DOC文档都被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;下载前须认真查看,确认无误后再购买;
4、文档大部份都是可以预览的,金锄头文库作为内容存储提供商,无法对各卖家所售文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;
5、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据;
6、如果您还有什么不清楚的或需要我们协助,可以点击右侧栏的客服。
下载须知 | 常见问题汇总

算法设计与分析P3_4

. . . . .问题描述设有n种不同面值的硬币,各硬币的面值存于数组T1:n中。现要用这些面值的硬币来找钱,可以实用的各种面值的硬币个数不限。(1)当只用硬币面值T1,T2,Ti时,可找出钱数j的最少硬币个数记为C(i,j)。若只用这些硬币面值,找不出钱数j时,记C(i,j)=。 给出C(i,j)的递归表达式及其初始条件。其中,1in,1jL.(2)设计一个动态规划算法,对于1jL,计算出所有的C(n,j).算法只允许使用一个长度为L的数组。用L和n作为变量表示算法的时间复杂性。(3)在C(n,j),1<=j<=L,已计算出的情况下,设计一个贪心算法,对任意钱数m<=L,给出用最少硬币找钱m的方法。当C(n,m)时,算法的计算时间为O(n+C(n,m)。分析这个问题用动态规划来解,归结到动态规划上面就变成了无限背包问题。区别在于,现在我们需要求一个最少的硬币数而不是最大值。但是选择的情况也是相同的,即每次选择都可以选择任何一种硬币。 首先,找零钱问题具有最优子结构性质:兑换零钱问题的最优子结构表述:对于任意需要找的钱数j,一个利用Tn中的n个不同面值钱币进行兑换零钱的最佳方案为P(T(1),j),P(T(2),j),.,P(T(n),j),即此时的最少钱币个数C(n,j)=k=0nP(T(k),j)则P(T(2),j),.,P(T(n),j)一定是利用Tn中n个不同的面值钱币对钱数j=j-P(T(1),j)* T(1)进行兑换零钱的最佳方案。其次,找零钱问题具有重叠于问题性质:a)当n=1时,即只能用一种钱币兑换零钱,钱币的面值为T0,有 (2) 根据分析建立正确的递归关系:复杂度:算法的时间复杂度主要取决于程序的两个循环,所以算法的时间复杂度为:O(n2);算法执行过程中引入了一个二维数组,随着输入规模的增大,所需要的空间复杂度为:O(n2)算法: #include<iostream> #include<cstring> using namespace std; #define MAX 20002 #define INF 9999999 #define min(a,b) (a)>(b)?(b):(a) int T11,Coins11,n;/硬币面值数组T,可以使用的各种面值的硬币个数数组 Coins,n种不同面值的硬币 int cMAX;/数组c存放要找的最少硬币个数 int m; /要找的钱数m void init() int i; cout<<"输入硬币的面值种数:" cin>>n; cout<<"n输入硬币面值及其此面值硬币的个数:"<<endl; for(i=0;i<n;+i) cin>>Ti>>Coinsi; cout<<"n输入要找的钱数:" cin>>m; int main(int argc, char *argv) init(); for(int i=0;i<=m;+i) ci=INF; c0=0; for(int i=0;i<n;+i) for(int j=1;j<=Coinsi;+j) for(int k=m;k>=Ti;-k) ck=min(ck,ck-Ti+1); if(cm!=INF) cout<<"n最少硬币个数为:"<<cm<<endl; else cout<<"-1"<<endl; return 0; 运行结果:时间复杂度: 从上面算法可知,最优值cj的计算过程中,最外层为循环for(j=1;j<=L;j+)嵌套着while(k>1&&flag=0)循环,而while(k>1&flag=0)循环中又嵌套着三个并列的for循环。因此本算法最坏情况下的复杂度是O(L*2n);最好的情况当然是里面for循环的条件不满足而不执行,此时的复杂度为O(L*n)。其中:L表示需要兑换的零钱数,对于L来说,该值一般不是很大,对于钱币来说,L会小于100元,即10 000分;n表示钱币的种类,n值一般不会很大如钱币总的有13种(从1分,2分,100元)。经过以上分析,如是最坏情况时的复杂度应为O(L*2n),则该值对于内存和运行速度较小的自动售货机等的应用前景则不会很好。但本算法中的递归结构在L>Tn时,有可见对于钱币j=L时,求c(n,j)时,并不要求对从1ij,的所有情况都要求c(n,i)+1,而是只求。其中:1kn。钱币一般只有13种左右,因此其效率大为上升。最坏的情况下需要执行而M小于100元即10000分,远大于n。本算法的动态规划算法的时间复杂性比该问题的一般动态规划算法的效率要好得多。该算法的时间复杂性是103数量级的对于应用于自动售货机等运行速度较慢的机器来说是不成问题的。贪心算法由贪心算法可知尽量用大面值的硬币组合来找钱,可以使使用的硬币最少。而贪心算法对最少硬币问题的解决总是可以得到最优解很好的近似解。   例如:9分面值的硬币5枚,8分面值的硬币5枚,  2分面值的硬币8枚,要找25分钱。  设要找的钱为m,硬币种类为n,ti(0<i<=n)为硬币的面值,ci为可以使用的各种面值的硬币个数, ki为第i种面值的硬币可以使用的最多个数  (ki=minm/ti,ci) (1)将硬币依面值大小排序 9 8 2  (2)按面值种类划分不同情况 有多少种面值就划分多少种情况. 每种情况的第一枚硬币面值各不一样,其后对剩余的硬币按面值从大到小排列.  划分为三个情况:982,892,298。  对应ki为:k0=3, k1=3 ,k2=8  得到近似最优解群为9分1枚,8分2枚;9分1枚,8分1枚,2分4枚;9分1枚,2分8枚. 算法优化 1,在寻找最优组合过程中,有些情况可以不予考虑。比如上例中2 9 8 2,在以小面值的硬币为第一个的情况中,在寻找最优组合时,会遇到两种情况:  a、使用硬币个数要比以大面值的硬币(如9和8)为第一个的情况大得多。  b、寻找到的组合与前面的情况有重复。 完整程序代码如下: #include <stdio.h> #include <fstream.h> #include<stdlib.h> int n,money; struct ctype   int value;  int coin;  template<class type> void make2Darray(type * * &x,int rows,int cols)   x=new type *rows;  for(int i=0;i<rows;i+)  xi=new typecols;  void swap(ctype &a,ctype &b)   ctype temp; temp=a; a=b; b=temp;  int partition(ctype array,int p,int r)  int i,j; ctype key; i=p; j=r+1; key=arrayp; while(true)  while(array+i.value<key.value); while(array-j.value>key.value); if(i>=j) break;  swap(arrayi,arrayj);  arrayp=arrayj; arrayj=key; return j;  void quicksort(ctype array,int p,int r)   int q; if(p<r)  q=partition(array,p,r); quicksort(array,p,q-1); quicksort(array,q+1,r);   void main()   ifstream input("input.txt");  ofstream output("output.txt");  input>>n;  int * coins=new intn+1;  ctype * T=new ctypen+1;  for(int i=1;i<=n;i+)   input>>Ti.value;  input>>Ti.coin;   input>>money; quicksort(T,1,n); /*for(i=1;i<=n;i+)  coinsi=Ti.coin; */  int max=0;  for(i=1;i<=n;i+)  max+=Ti.coin;  max+=10;   int * min=new intmoney+1;   min0=0; int * * cnum;  make2Darray(cnum,money+1,n+1);  for(i=0;i<=money;i+)  for(int j=1;j<=n;j+)  cnumij=0; if(T1.value=1) min1=1;cnum11=1; else min1=max;  int j=2;  while(j<=money)   minj=max;  i=1;   while(i<=n)&&(j>=Ti.value)      int coinumber=cnumj-Ti.valuei;  coinumber+;  if(minj>1+minj-Ti.value)&&(coinumber<=Ti.coin)      for(int k=1;k<=n;k+) cnumjk=cnumj-Ti.valuek;   cnumji+;   minj=1+minj-Ti.value;    i+;       j+;   if(minmoney!=max) output<<minmoney;  else output<<-1; 宁可累死在路上,也不能闲死在家里!宁可去碰壁,也不能面壁。是狼就要练好牙,是羊就要练好腿。什么是奋斗?奋斗就是

注意事项

本文(算法设计与分析P3_4)为本站会员(xmg****18)主动上传,金锄头文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即阅读金锄头文库的“版权提示”【网址:https://www.jinchutou.com/h-59.html】,按提示上传提交保证函及证明材料,经审查核实后我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.