贪心算法-找零问题-实验报告.docx

贪心算法-找零问题-实验报告.docx

ID:57382719

大小:44.32 KB

页数:7页

时间:2020-08-14

贪心算法-找零问题-实验报告.docx_第1页
贪心算法-找零问题-实验报告.docx_第2页
贪心算法-找零问题-实验报告.docx_第3页
贪心算法-找零问题-实验报告.docx_第4页
贪心算法-找零问题-实验报告.docx_第5页
资源描述:

《贪心算法-找零问题-实验报告.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、实验三课程名称:算法设计与实现实验名称:贪心算法-找零问题实验日期:2019年5月2日仪器编号:007班级:数媒0000班姓名:郝仁学号实验内容假设零钱系统的币值是{1,p,p^2,……,p^n},p>1,且每个钱币的重量都等于1,设计一个最坏情况下时间复杂度最低的算法,使得对任何钱数y,该算法得到的零钱个数最少,说明算法的主要设计思想,证明它的正确性,并给出最坏情况下的时间复杂度。实验分析引理1(离散数学其及应用3.1.4):若n是正整数,则用25美分、10美分、5美分和1美分等尽可能少的硬币找出的n美分零钱中,至多有2个10美分、至多有1个5美分、

2、至多有4个1美分硬币,而不能有2个10美分和1个5美分硬币。用10美分、5美分和1美分硬币找出的零钱不能超过24美分。证明如果有超过规定数目的各种类型的硬币,就可以用等值的数目更少的硬币来替换。注意,如果有3个10美分硬币,就可以换成1个25美分和1个5美分硬币;如果有2个5美分硬币,就可以换成1个10美分硬币;如果有5个1美分硬币,就可以换成1个5美分硬币;如果有2个10美分和1个5美分硬币,就可以换成1个25美分硬币。由于至多可以有2个10美分、1个5美分和4个1美分硬币,而不能有2个10美分和1个5美分硬币,所以当用尽可能少的硬币找n美分零钱时,

3、24美分就是用10美分、5美分和1美分硬币能找出的最大值。假设存在正整数n,使得有办法将25美分、10美分、5美分和1美分硬币用少于贪心算法所求出的硬币去找n美分零钱。首先注意,在这种找n美分零钱的最优方式中使用25美分硬币的个数q′,一定等于贪心算法所用25美分硬币的个数。为说明这一点,注意贪心算法使用尽可能多的25美分硬币,所以q′≤q。但是q′也不能小于q。假如q′小于q,需要在这种最优方式中用10美分、5美分和1美分硬币至少找出25美分零钱。而根据引理1,这是不可能的。由于在找零钱的这两种方式中一定有同样多的25美分硬币,所以在这两种方式中10

4、美分、5美分和1美分硬币的总值一定相等,并且这些硬币的总值不超过24美分。10美分硬币的个数一定相等,因为贪心算法使用尽可能多的10美分硬币。而根据引理1,当使用尽可能少的硬币找零钱时,至多使用1个5分硬币和4个1分硬币,所以在找零钱的最优方式中也使用尽可能多的10美分硬币。类似地,5美分硬币的个数相等;最终,1美分的个数相等。同上,由于1+p1+p2+p3+...pk-1=pk-1

5、好的结果。假若最优解不含币值的钱币,即那么存在,如果不是,则与矛盾,不妨设,那么用1个币值为的钱币替换p个币值为的钱币,总钱币数将减少,与这个解为最优解矛盾。下面证明最优解签好含有个币值的钱币。设钱数为y时最优解是,则设其中通过对t的归纳不难证明,即最优解中含有个币值的钱币。上诉算法在最坏情况下的时间复杂度是.实验源代码//找零ConsoleApplication1.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。//数媒1703班--唐思成//coin.cpp:定义控制台应用程序的入口点。//#include"pch.h"#inclu

6、de#includeusingnamespacestd;//money需要找零的钱//coin可用的硬币的种类//n硬币种类的数量voidZhaoLing(intmoney,int*coin,intn){int*coinNum=newint[money+1]();//存储1...money找零最少需要的硬币的个数int*coinValue=newint[money+1]();//最后加入的硬币,方便后面输出是哪几个硬币coinNum[0]=0;for(inti=1;i<=money;i++){intminNum=i;

7、//i面值钱,需要最少硬币个数intusedMoney=0;//这次找零,在原来的基础上需要的硬币for(intj=0;j=coin[j])//找零的钱大于这个硬币的面值{if(coinNum[i-coin[j]]+1<=minNum&&(i==coin[j]

8、

9、coinValue[i-coin[j]]!=0))//所需硬币个数减少了{minNum=coinNum[i-coin[j]]+1;//更新usedMoney=coin[j];//更新}}}coinNum[i]=minNum;coinValue[i]=usedMoney

10、;}//输出结果if(coinValue[money]==0)cout<<"找不开零钱"<

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。