c语言贪心算法找零问题,贪心算法-找零问题-实验报告

《贪心算法-找零问题-实验报告》由会员分享,可在线阅读,更多相关《贪心算法-找零问题-实验报告(7页珍藏版)》请在人人文库网上搜索。

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

2、和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美分零钱时,24美分就是用10美分、5美分和1美分硬币能找出的最大值。假设存在正整数n,使得有办。

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

4、硬币。而根据引理1,当使用尽可能少的硬币找零钱时,至多使用1个5分硬币和4个1分硬币,所以在找零钱的最优方式中也使用尽可能多的10美分硬币。类似地,5美分硬币的个数相等;最终,1美分的个数相等。同上,由于1+p1+p2+p3+.pk-1=pk - 1#includeusing namespace std;/money需要找零的钱/coin可用的硬币的种类/n硬币种类的数量void ZhaoLing(int money, int *coin, int n)int *coinNum = new intmoney + 1();/存储1.money找零最少需要的硬币的个数int *coinValue 。

5、= new intmoney + 1();/最后加入的硬币,方便后面输出是哪几个硬币coinNum0 = 0;for (int i = 1; i = coinj)/找零的钱大于这个硬币的面值if (coinNumi - coinj + 1 0)cout Money;cout n;int*coin = (int*)malloc(n * sizeof(int);/定义动态长度的数组cout p;if (p 0) break;else cout 输入的数小于零,请重新输入 endl;for (i = 0; i n; i+) coini = pow(p, i);cout 找零系统中的零钱种类为: endl;for (i = 0; i n; i+) cout coini ,;cout endl;ZhaoLing(Money, coin, n);system(pause);return 0;实验结果。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值