问题描述:

拼凑面额

给你六种面额1、5、10、20、50、100元的纸币,假设每种币值的数量都足够多,编写程序求组成N元(N为0-10000的非负整数)的不同组合的个数。

输入描述: 输入为一个数字N,即需要拼凑的面额

输出描述: 输出也是一个数字,为组成N的组合个数。

示例

输入:5

输出:2

问题分析:

经典题目,类似于揹包问题或者上台阶问题(上台阶问题只有两种情况,而这个有几种面额零钱就有多少种情况),昨天晚上58到家的现场宣讲会笔试题,其实牛客网上也有的,链接已经给出。现在总结一下,动态规划解决,具体思路如下:

(1)设 dp[n,m]表示 N元钱,且有零钱M种时,不同组合数。并且,把基本零钱放到nums=[1, 5, 10, 20, 50, 100]。(后面的m,都可以理解为第m种零钱,或者当前有m种零钱即可)

(2)现在思考 dp[n,m]怎么求?很容易联想到上台阶问题,要想得到dp[n,m]的值,一定是从∑ j = 0 m d p [ n − n u m s [ j ] , m ] + d p [ n , m − 1 ] \sum _{j=0} ^{m}{dp[n-nums[j], m]}+dp[n, m-1]∑j=0m​dp[n−nums[j],m]+dp[n,m−1]得到的,具体点:

A、当m相等时,当前状态一定是前m种状态的总和,即,∑ j = 0 m d p [ n − n u m s [ j ] , m ] \sum _{j=0} ^{m}{dp[n-nums[j], m]}∑j=0m​dp[n−nums[j],m]。

B、当n相等时,很显然当前有m种零钱,它情况一定包含m-1种零钱的所有情况,即,d p [ n , m − 1 ] dp[n, m-1]dp[n,m−1]

C、最后 dp[n,m]就是这两种情况的和。

要注意的是n-nums[m]>=0是前提条件。所以得出状态转移方程为:

1. n >=nums[j] 时:d p [ n , m ] = d p [ n , m − 1 ] + ∑ j = 0 m d p [ n − n u m s [ j ] , m ] dp[n,m]=dp[n, m-1]+\sum _{j=0} ^{m}{dp[n-nums[j], m]}dp[n,m]=dp[n,m−1]+∑j=0m​dp[n−nums[j],m]

2. n < nums[j] 时:d p [ n , m ] = d p [ n , m − 1 ] dp[n,m]=dp[n, m-1]dp[n,m]=dp[n,m−1]

3. 此外就边界情况,均为1

(3)dp空间压缩,先看一下下面得图片:

dp[10,2] = dp[10,1] + dp[0, 2] = 3 + 1 = 4 在结合上面的公式不难发现,当前值,只和上面一行的值(情况B),还有本行的值(情况A)有关,所以,现在可以压缩一下dp空间,即,一行一行的计算。

Python3实现:

# @Time :2018/10/12

# @Author :LiuYinxing

# 动态规划 - 类似于揹包问题、上台阶问题

class Solution:

def solve(self, n):

nums = [1, 5, 10, 20, 50, 100] # 基本面额

dp = [1] * (n + 1) # 初始化dp

for j in range(1, 6):

for i in range(1, n+1):

if i >= nums[j]: # 约束条件

dp[i] += dp[n - nums[j]]

return dp[-1]

if __name__ == '__main__':

solu = Solution()

print(solu.solve(n=7))

声明: 总结学习,有问题或不妥之处,可以批评指正哦。

[1] 题目/参考-链接:www.nowcoder.com/questionTerminal/14cf13771cd840849a402b848b5c1c93

python面值组合_算法题 - 拼凑面额 - Python相关推荐

  1. python面值组合_【题目1】硬币面值组合

    问题描述 评测题目: 给定 m 种面值的硬币,每种面值的硬币有无限多个,它们的面值分别为C=[c[0], c[1], -, c[m-1]],现用这些面值的硬币凑齐 n 元,求有多少种方法.如 n=3, ...

  2. 《大厂算法面试题目与答案汇总,剑指offer等常考算法题思路,python代码》V1.0版...

    为了进入大厂,我想很多人都会去牛客.知乎.CSDN等平台去查看面经,了解各个大厂在问技术问题的时候都会问些什么样的问题. 在看了几十上百篇面经之后,我将算法工程师的各种类型最常问到的问题都整理了出来, ...

  3. 100个灯泡python编程_算法题:一个圆环上有100个灯泡,灯泡有打...

    算法题:一个圆环上有100个灯泡,灯泡有打开关闭两种状态,灯泡状态随机,按一个灯泡,相邻两个灯泡的状态也会改变. eg: ' 暗 - 亮 - 暗 ' 按中间灯泡 ,变化为 ' 亮 - 暗 - 亮 '. ...

  4. ExpRe[4] python[1] 单元测试,算法题对拍

    文章目录 一个错误题解 单元测试发现错误 更正错误 再次发现错误和更正 总结和问答练习 时效性 本篇撰写时间为2021.11.13,由于计算机技术日新月异,博客中所有内容都有时效和版本限制,具体做法不 ...

  5. java数组排列组合_java算法题--递归求数组中数字排列组合问题

    java算法题–递归求数组中数字排列组合问题 题目:有一个数组{1,2,3},输出数组中数字的所有可能组合: 比如:123.132.213- 解题思路 通过递归不停的交换数组中的两个数(当然,肯定是有 ...

  6. pat根据中序遍历和先序遍历_算法题399:从前序与中序遍历序列构造二叉树

    (给算法爱好者加星标,修炼编程内功) 来源: 数据结构和算法-山大王wld 问题描述 今天我们就不做关于双指针的了,我们爬到树上玩会儿,做一道关于二叉树的题.今天的题就一句话,根据一棵树的前序遍历与中 ...

  7. python快速排序算法循环_算法:快速排序的Python实现

    一.概述 快速排序(quick sort)是一种分治排序算法.该算法首先 选取 一个划分元素(partition element,有时又称为pivot):接着重排列表将其 划分 为三个部分:left( ...

  8. python矩阵组合_用产品组合矩阵平衡您的产品组合

    python矩阵组合 产品组合矩阵是一个方便的工具,可以帮助您做出正确的产品组合决策. 这篇文章说明了如何有效地将其用于管理数字产品组合. 重装上阵 产品投资组合矩阵 (也称为增长份额和BCG矩阵)希 ...

  9. print python excel分隔_合并/拆分 Excel?Python、VBA轻松自动化

    作者 | Ryoko 来源 | 凹凸数据 当你收集了 n 个人的 EXCEL 记录表,需要将它们汇成一个总表时你会怎么做呢? 如果不通过技术手段,要一个个打开再复制粘贴也太麻烦了吧! 此时就需要一个通 ...

  10. python 温度 符号_【火马】Python学习小记01

    Python 学习小记 Life is short,you need Python! 写在前面 自从重新拾起2016年开始注册的公众号"火马编程",我就把TA当作了自己的一块&qu ...

最新文章

  1. 计算机网络技能专项训练一:基础配置
  2. Android控件布局属性全解(一看就会)
  3. ElasticSearch-7.10版本最新万字长文教程【距离搞懂ELK核心你只差这一片文章】
  4. Apache Spark中实现的MapReduce设计模式
  5. linux ls 命令排序,如何在Linux中使用ls命令按大小对所有文件进行排序
  6. curl和file_get_contents 区别以及各自的优劣
  7. 贪吃蛇javascript代码_源于Jquery开发贪吃蛇游戏——简单思路分析总结
  8. 11gpath失败 oracle_win10安装oracle11g提示path长度不够,该怎样解决?
  9. Python的类和继承中的属性变量
  10. unity粒子特效与ui遮盖显示
  11. 如何搭建一个vue项目(完整步骤)
  12. 推荐系统中的前沿技术研究与落地:深度学习、AutoML与强化学习 | AI ProCon 2019
  13. C#: 数字经纬度和度分秒经纬度间的转换
  14. 解二元一次方程组程序
  15. 本周AI热点回顾:政府数据将开放共享、生命游戏发明者逝世、百度Apollo对外发布“ACE 交通引擎”
  16. 最近自己安装CDH5.X版本时发现,CM包和parcels包无法下载了。
  17. 不能爬小程序,叫什么会爬虫
  18. trigger()方法
  19. Ubuntu+Mac使用飞鸽传书iptux进行互通
  20. css及css3学习

热门文章

  1. 算法-求二进制数中1的个数
  2. eclipse修改java编译的版本
  3. stringbuffer字符串反转操作
  4. 深入理解 RecyclerView 系列之:ItemDecoration
  5. MonkeyDevice Class
  6. 今天开始用 VSU 2010
  7. HTML DOM教程 5-HTML DOM节点访问
  8. linux目录与文件
  9. C++ 堆栈结构(超详解)
  10. 802.11介质访问控制——CSMA/CD协议详解