一个具体的找零钱问题:

参考:程序员面试再也不怕动态规划了,看动画,学DP,找零钱 (LeetCode 322)

硬币面值:1,2,5,7,10
找零金额:14

  • step1:定义长度为15的dp数组
    所有元素初始化为-1, d p [ 0 ] = 0 dp[0] = 0 dp[0]=0
  • step2:遍历coins列表找出小于金额的硬币面值 j j j,接着再使用 d p [ i − c o i n s [ j ] ] dp[i-coins[j]] dp[i−coins[j]]来找出 i − c o i n s [ j ] i-coins[j] i−coins[j]的最优解;最终金额 i i i的最优解为 1 + d p [ i − c o i n s [ j ] ] 1+dp[i-coins[j]] 1+dp[i−coins[j]]。
    d p [ 1 ] = d p [ 0 ] + 1 = 1 dp[1]=dp[0]+1=1 dp[1]=dp[0]+1=1
    d p [ 2 ] = d p [ 0 ] + 2 dp[2]=dp[0]+2 dp[2]=dp[0]+2、 d p [ 2 ] = d p [ 1 ] + 1 dp[2]=dp[1]+1 dp[2]=dp[1]+1,而 d p [ 0 ] < d p [ 1 ] dp[0]<dp[1] dp[0]<dp[1],故 d p [ 2 ] = d p [ 0 ] + 2 = 1 dp[2]=dp[0]+2=1 dp[2]=dp[0]+2=1
    d p [ 3 ] = 1 + d p [ 2 ] dp[3]=1+dp[2] dp[3]=1+dp[2]、 d p [ 3 ] = 2 + d p [ 1 ] dp[3]=2+dp[1] dp[3]=2+dp[1],而 d p [ 1 ] = d p [ 2 ] = 1 dp[1]=dp[2]=1 dp[1]=dp[2]=1,故 d p [ 3 ] = 1 + 1 = 2 dp[3]=1+1=2 dp[3]=1+1=2
    d p [ 4 ] = 1 + d p [ 3 ] dp[4]=1+dp[3] dp[4]=1+dp[3]、 d p [ 4 ] = 2 + d p [ 2 ] dp[4]=2+dp[2] dp[4]=2+dp[2],而 d p [ 2 ] < d p [ 3 ] dp[2]<dp[3] dp[2]<dp[3],故 d p [ 4 ] = 2 dp[4]=2 dp[4]=2
    d p [ 5 ] = d p [ 0 ] + 1 = 1 dp[5]=dp[0]+1=1 dp[5]=dp[0]+1=1
    d p [ 6 ] = 1 + d p [ 5 ] dp[6]=1+dp[5] dp[6]=1+dp[5]、 d p [ 6 ] = 2 + d p [ 4 ] dp[6]=2+dp[4] dp[6]=2+dp[4]、 d p [ 6 ] = 5 + d p [ 1 ] dp[6]=5+dp[1] dp[6]=5+dp[1]
    同理,计算出剩下所有金额的最优解:

C++版

using namespace std;
class Solution{public:int coinChange(vector<int>&coins,int amount){vector<int>dp(amount+1,-1);dp[0]=0;for(int i=1;i<=amount;i++){for(int j=0;j<coins.size();j++){if(coins[j]<=i&&dp[i-coins[j]!=-1){//如果当前金额还未计算或者dp[i]比正在计算的解大,则更新最优解dp[i]if(dp[i]==-1||dp[i]>dp[i-coins[j]]+1)dp[i]=dp[i-coins[j]]+1;}}}return dp[amount] //返回金额amount的最优解}
}

python版

采用动态规划编写一个找零钱函数dpMakeChange,接收硬币面值列表coinValueList和找零金额change两个参数,返回change对应的最少硬币数的找零详情字典(包含所用的每种硬币面值和个数)。

def dpMakeChange(coinValueList, change):minCoins = [0] * (change + 1)#初始化minCoins列表为0coinsUsed = {}#保存的是找零钱change最后一枚找的币值for cents in range(change + 1):coinCount = cents#初始化硬币数量为金额centsnewCoin = 1#遍历硬币列表coinValueList,遍历小于金额cents的硬币面值for j in [c for c in coinValueList if c <= cents]:#如果当前正在求的最优解小于当前金额的coinCount,则更新coinCount值if minCoins[cents - j] + 1 < coinCount:coinCount = minCoins[cents - j] + 1newCoin = jminCoins[cents] = coinCount#把最优的coinCount值放入minCoins表中coinsUsed[cents] = newCoinchangeDetails = {}#保存找零金额change对应最少硬币数的找零详情字典while change > 0:thisCoin = coinsUsed[change]if thisCoin in changeDetails:changeDetails[thisCoin] += 1else:changeDetails[thisCoin] = 1change -= thisCoinreturn changeDetails

【数据结构】动态规划——找零钱问题解析(含c++和python代码)相关推荐

  1. java 动态规划找零钱_动态规划之找零钱问题

    找零钱是一个经典的动态规划问题.这种问题,我建议,首先学会暴力解法,然后从暴力解法中优化出动态规划的解法,这样,更能体会动态规划的魅力. 问题描述 有n种不同币值的硬币,硬币数量无限.给定一个数量T, ...

  2. java 动态规划找零钱_初探动态规划——LeetCode找零钱问题

    1.简介: 在leetcode上刷题的时候,遇到了一道找零钱的动态规划题,后台测试用例很变态,必须把算法优化的很好才能通过.也借此机会好好的研究了一下动态规划.在下小白一个,大神轻喷. 2.题目如下: ...

  3. 动态规划--找零钱有多少种方法

    问题: 给定数组arr,arr中的所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求换钱有多少种方法. 分析:arr长度为N,生成 ...

  4. python from import找不到库_如何查找python代码中所有未使用到的from与import的类库...

    假定你的代码中都没有直接从locals()/globals()中获取b的引用,那这还是比较容易的,下面给你举个例子吧. 比如这段代码:from a import b b 你可以用python的comp ...

  5. 【Pyqt实战】1-100算式练习题自动生成器(含UI界面,python代码),可自行选择参数

    1-100算式练习题自动生成器 主界面 主要功能 示例图片 算式生成核心源码如下 生成可执行的exe文件 完整代码与exe文件 主界面 最近用Pyqt5编写了一个算式题自动生成器,可自动生成1-100 ...

  6. 【图像处理】——图像质量评价指标信噪比(PSNR)和结构相似性(SSIM)(含原理和Python代码)

    目录 一.信噪比(PSNR) 1.信噪比的原理与计算公式 2.Python常规代码实现PSNR计算 3.TensorFlow实现PSNR计算 4.skimage实现PSNR计算 5.三种方法计算的结果 ...

  7. python下面的代码_解析一下下面的python代码?

    class Model(dict, metaclass=ModelMetaclass): # 初始化, 没啥好说的 def __init__(self, **kw): super(Model, sel ...

  8. 数据结构之图:有向图的拓扑排序,Python代码实现——26

    有向图的拓扑排序 拓扑排序介绍 什么是拓扑排序? 一个有向图的拓扑排序(Topological sort 或 Topological ordering)是根据其有向边从顶点U到顶点V对其所有顶点的一个 ...

  9. 数据结构之平衡树:红黑树的介绍与Python代码实现——17

    红黑树的介绍与Python代码实现 红黑树的介绍 红黑树(Red-Black Tree)是一种平衡二叉查找树,它是一种以比较简单的方式实现的2-3查找树 红黑树基于2-3查找树的表现 红链接:将两个2 ...

最新文章

  1. 计算机全球服务器,云计算的宿命:全球合并成一台计算机,支持无服务器运行...
  2. 3.1常用类(java学习笔记)包装类及日期类
  3. (转载)HTML--- input type=hidden
  4. php fpm.conf 注释,使用sed处理php-fpm.conf和nginx.conf文本里的注释信息
  5. JavaScript每日学习日记(2)
  6. 线粒体和叶绿体的基因组特点_如何组装植物叶绿体基因组
  7. ERP-非财务人员的财务培训教(四)------公司/部门的成本与费用控制
  8. 文思海辉值得去吗_文思海辉与全球智能自动化领导者Blue Prism结盟!
  9. java api教程_Java api 入门教程 之 JAVA的文件操作
  10. android 连续调用方法是,android – SwitchPreferences多次调用onPreferenceChange()方法
  11. C#-反射知识点(转载)
  12. 教你PDF怎么压缩的小一点?PDF压缩方法
  13. 用C#实现汉字转化为拼音
  14. Java 计蒜客——开关灯
  15. PLC故障排查步骤的思路和方法
  16. video视频快进拖动限制
  17. 导航栏: UINavigationBar用法
  18. linux编译动态库未定义,GCC链接库的一个坑:动态库存在却提示未定义动态库的函数...
  19. Android音量调节的实现(RingtoneManager和RingerVolumePreference)
  20. nagios监控安装配置文档+139邮箱报警

热门文章

  1. AI语音机器人来袭,改变传统电销模式
  2. CPU和主存包括什么?
  3. 最新世界大学排名:计算机专业哪家强?
  4. [编程题]:n头牛中选择满足所有m种特性的牛(百度2021)
  5. 教你如何使用Python写游戏辅助脚本
  6. 流媒体-RTP/RTCP
  7. 优化算法系列-模拟退火算法(1)——基本原理枯燥版本
  8. 面试篇-- Http、TCP/IP协议与Socket之间的区别
  9. LeetCode 热题100答案
  10. 使用PHP生成PDF文档