问题描述:给出几种面值的硬币,要求用这几种硬币找零出所给零钱数,用的硬币数要最少。

过去我们用过贪心法解决此类问题,包括本人在百度面试时,也是用的贪心法(面试官对这个解答不满意),贪心法只适用于硬币特殊的情况下(1,3,5),如果现在硬币的面值为10,7,3,1,要求给出21的找零方案,那么贪心会给出10,7,3,1的方案,而不是3个7块的最佳方案。

那么动态规划又该如何解决,动态规划在于在解决问题的途中用到之前的得到的答案。

思考:求n的找零方案时,可将问题分解为1-(n-1)的找零方案中加上一个已知面值的硬币,求其最小值便可。

代码如下:

#include<iostream>
using namespace std;//三个参数依次是硬币面值数组,硬币种类,给出的零钱
void getMin(int *values,int valueKinds,int money){int *coinUsed = new int[money+1]();int *coinUsedNum = new int[money+1]();//(之前写的代码无法得出在无法找零情况下的正确答案,用这个数组不仅可以记录给出的硬币,还可以得出是否能找开的情况) coinUsed[0] = 0;for(int cent=1;cent<=money;cent++){//每个零钱找零的最大值便是最小面值组成的个数 int minCent = cent;int moneyUsed = 0;for(int kind=0;kind<valueKinds;kind++){if(values[kind]<=cent){//所查找找零最小数为已知的零钱找零数 + 一个已有面值,便是最少硬币方案 int temp = coinUsed[cent - values[kind]] + 1;//此处应该做一个判断,即是否找得开,找不开便不必更新最小值 if(temp <= minCent && (cent == values[kind] || coinUsedNum[cent - values[kind]] != 0)){minCent = temp;moneyUsed = values[kind];}}}coinUsed[cent] = minCent;coinUsedNum[cent] = moneyUsed;}if(coinUsedNum[money] == 0){printf("面值为%d的零钱找不开!", money);} else {printf("面值为%d的最少找零数为%d,", money,coinUsed[money]);printf("找零面值分别为:");while(money>0){printf(" %d",coinUsedNum[money]);money -= coinUsedNum[money];}}
}int main(){int a[5] = {2,5,10,21,25};int money = 24;getMin(a,5,money);
} 

转载于:https://www.cnblogs.com/tz346125264/p/7341143.html

硬币找零问题,动态规划基础,百度面试题相关推荐

  1. java动态规划凑硬币问题,详解动态规划最少硬币找零问题--JavaScript实现

    硬币找零问题是动态规划的一个经典问题,其中最少硬币找零是一个变种,本篇将参照上一篇01背包问题的解题思路,来详细讲解一下最少硬币找零问题.如果你需要查看上一篇,可以点击下面链接: 详解动态规划01背包 ...

  2. 动态规划——硬币找零思路

    找零的两种问题 硬币找零问题,有两种.一种用贪心解决,一种用动态规划解决. 问题1:假设我们有 v1,v2,--,vn(单位是元)这些币值的硬币,它们的张数分别是 c1.c2.-, cn.我们现在要用 ...

  3. 最少硬币找零系列问题(01背包,完全背包,多重背包动态规划)

    背包问题思路解决最小硬币找零系列问题. 一.01硬币找零问题(01背包) 给定不同面额的硬币 coins 和总金额 m.每个硬币最多选择一次.计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬 ...

  4. 硬币找零问题的动态规划实现

    一,问题描述 给定一组硬币数,找出一组最少的硬币数,来找换零钱N. 比如,可用来找零的硬币为: 1.3.4   待找的钱数为 6.用两个面值为3的硬币找零,最少硬币数为2.而不是 4,1,1 因此,总 ...

  5. Python 动态规划(DynamicProgramming)-硬币找零

    动态规划(DynamicProgramming)-硬币找零 文章目录 动态规划(DynamicProgramming)-硬币找零 1.动态规划 a.什么是动态规划 b.适用对象 2.硬币找零-Codi ...

  6. 动态规划实战--硬币找零问题

    上一篇文章上提到硬币找零的例子,现在我们实战动态规划就从硬币找零开始 问题描述: 给定 n 种不同面值的硬币,分别记为 c[0], c[1], c[2], - c[n],同时还有一个总金额 k,编写一 ...

  7. 动态规划——硬币找零和币值最大化问题

    一.硬币找零问题 1.问题 有面值为1元.3元和5元的硬币若干枚,给定一个输入面额,问如何采用最少的硬币数目,得到当前面额 2.思路 找出状态转移方程,每次可以拿取1元.3元或者5元的硬币,每次拿取, ...

  8. 硬币找零 acm入门 day4--动态规划dp第一题

    A - 硬币找零 在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计算最少的找零硬币数,以便他们能从银行拿回最少的硬币数,并保证能用这些硬币发工资.我们应该注意到,人民币的硬 ...

  9. 最少硬币找零问题(js实现)

    最少硬币找零问题 例如,有以下面额(硬币):1,5,10,5. 如果要找36的零钱,我们可以用1个25的硬币.1个10的硬币和1个1的硬币. 如何将这个解答转化成算法? 今天我们只要采用两种方法来解决 ...

最新文章

  1. Static interface methods are only supported starting with Android N (--min-api 24): void okhttp3.log
  2. Spring Boot与Redis的集成
  3. 自定义元素探秘及构建可复用组件最佳实践
  4. HSI颜色空间及其应用
  5. linux中通过命令生成hex值
  6. java http客户端_java 11 标准Java异步HTTP客户端
  7. java cursor 删除_使用CursorRecyclerAdatper在RecyclerView中删除和撤消
  8. 监理公司的核心竞争力
  9. sql日期大于某天_(十五)sql/Linux 小技巧
  10. 【报告分享】2020年中国AI产业地图研究报告.pdf(附下载链接)
  11. 树莓派boot分区cmdline.txt
  12. linux 安装apache、tomcat问题汇总
  13. go 类型断言_深入理解Go的interface内部执行原理
  14. 用R解析Mahout用户推荐协同过滤算法(UserCF)
  15. 存储服务器格式化恢复方法
  16. 算法精解----3、单链表
  17. android pin码解锁,解锁三星的3种方法:SIM网络解锁PIN码
  18. HDU 4054 Hexadecimal View
  19. JS 案例 个人所得税计算器
  20. LA 5713 秦始皇修路

热门文章

  1. 为什么网格布局不显示java_java – 在GridLayout中不显示组件的FlowLayout?
  2. java虚拟机堆栈工作原理_java虚拟机工作原理?
  3. python的固定有没有固定字符_python每次处理固定个数的字符的方法总结
  4. python中getopt函数_Python中getopt()函数的使用
  5. 2014年二级c语言,2014年计算机二级考试C语言选择题
  6. layui下拉框的高度_LAYUI select 下拉框得高度
  7. python给js变量赋值_python 之 前端开发( JavaScript变量、数据类型、内置对象、运算符、流程控制、函数)...
  8. OSPF邻接关系的建立步骤
  9. java 堆排序方式_幾種排序方式的java實現(02:希爾排序,歸並排序,堆排序)
  10. java数组数据结构_Java数据结构之数组