pos机付款.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
pos机付款

超市POS机付款问题 一、问题描述 超市付款问题 超市的自动柜员机(POS机)要找给顾客数量最少的现金。请设计算法解决这种付款优化问题。 (提示:试写出用动态规划、贪心法等算法策略来解决该问题,找出多个付款方案、并分析程序运行结果和给出算法的复杂性分析。) 二、问题分析 超市的自动柜员机(POS机)要找给顾客数量最少的现金。例如要找4元6角,如果POS机送出一大堆硬币,比如46个1角钱,就太麻烦了,而最好找2个2元、1个5角和1个1角的。 动态规划: 假定POS机中有n张面值为的货币,用集合表示,如POS机需支付的现金为A,那么,它必须从P中选取一个最小子集S,使得 (1) 如果用向量表示S中所选取的货币,则 (2) 那么,POS机支付的现金必须满足 (3) 并且 (4) 在上述问题中集合P是该问题的输入,满足式(1)和解称为可行解,式(2)是解的表现形式,因为向量X中有n 个元素,每个元素的取值为0或1,所以,可以有个不同的向量,所有这些向量的全体构成该问题的解空间,式(3)是该问题的约束条件,式(4)是该问题的目标函数,使式(4)取得极小值的解称为该问题的最优解。 对POS机付款问题: (1)count[i]表示凑合数量为i所需最少的钱币数量,即最优值。 (2)则count[i]=min{count[i-T[j]]+1}(原问题分段)。 (3)其中0=j=N-1动态规划函数的递进式。 (4)满足(T[j]= icount[i-T[j]]+1count[i]),则选取第i张钱币。 贪心算法: 在POS机付款问题每一步的贪心选择中,在不超过应付款金额的条件下,只选择面值最大的钱币,而不去考虑在后面看来这种选择是否合理,而且它还不会改变决定:一旦选择了一张钱币,就永远决定。要尽可能使付出的钱币最快地满足支付要求,其目的是付出的钱币张数慢慢地增加。 在money!=0的情况下: 如果: money=p[i],则选取第i张钱币,同时money=money-p[i]. 否则: 不选取第i张钱币,同时i++,进行下一站钱币的判断。直到money!=0. 三、算法思想 动态规划算法: 动态规划法利用问题的最优性原理,以自底向上的方式从子问题的最优解逐步构造出整个问题的最优解。应用动态规划法设计算法一般分为3个阶段: (1)分段:将原问题分解成为若干个相互重叠的子问题。 (2)分析:分析问题是否满足最优性原理,找出动态规划函数的递进式。 (3)求解:利用递进式自底向上计算,实现动态规划过程。 贪心算法: 顾名思义,贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。当然,希望贪心算法得到的最终结果也是整体最优的。虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。可以用贪心法求解的问题中一般具有两个重要的性质:最优子结构性质和贪心选性质。 四、C++源代码 动态规划算法: #include iostream.h const int M=100; const int N=100; int T[100]; // 数组T[]表示存放n种货币递增的面值,money表示所要找的零钱 int count[M];//count[i]表示凑合数量为i所需最少的钱币数量,即最优值,则count[i]=min{count[i-T[j]]+1},其中0=j=N-1 int select[M];//每个表示count[i]在取最小值时的选择,即上式中的j void array(int T[],int n) { int i,j,temp; for(i=1;i=n;i++)//冒泡排序 { for(j=1;j=n-i;j++) { if(T[j]T[j+1]) { temp=T[j]; T[j]=T[j+1]; T[j+1]=temp; } } } } int money_change(int money) { int i = 0; int j = 0; for(i=0;i=M;i++) count[i]=0xffff; count[0] =

文档评论(0)

rachel + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档