python面值组合_算法题 - 拼凑面额 - Python
问题描述:
拼凑面额
给你六种面额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=0mdp[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=0mdp[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=0mdp[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相关推荐
- python面值组合_【题目1】硬币面值组合
问题描述 评测题目: 给定 m 种面值的硬币,每种面值的硬币有无限多个,它们的面值分别为C=[c[0], c[1], -, c[m-1]],现用这些面值的硬币凑齐 n 元,求有多少种方法.如 n=3, ...
- 《大厂算法面试题目与答案汇总,剑指offer等常考算法题思路,python代码》V1.0版...
为了进入大厂,我想很多人都会去牛客.知乎.CSDN等平台去查看面经,了解各个大厂在问技术问题的时候都会问些什么样的问题. 在看了几十上百篇面经之后,我将算法工程师的各种类型最常问到的问题都整理了出来, ...
- 100个灯泡python编程_算法题:一个圆环上有100个灯泡,灯泡有打...
算法题:一个圆环上有100个灯泡,灯泡有打开关闭两种状态,灯泡状态随机,按一个灯泡,相邻两个灯泡的状态也会改变. eg: ' 暗 - 亮 - 暗 ' 按中间灯泡 ,变化为 ' 亮 - 暗 - 亮 '. ...
- ExpRe[4] python[1] 单元测试,算法题对拍
文章目录 一个错误题解 单元测试发现错误 更正错误 再次发现错误和更正 总结和问答练习 时效性 本篇撰写时间为2021.11.13,由于计算机技术日新月异,博客中所有内容都有时效和版本限制,具体做法不 ...
- java数组排列组合_java算法题--递归求数组中数字排列组合问题
java算法题–递归求数组中数字排列组合问题 题目:有一个数组{1,2,3},输出数组中数字的所有可能组合: 比如:123.132.213- 解题思路 通过递归不停的交换数组中的两个数(当然,肯定是有 ...
- pat根据中序遍历和先序遍历_算法题399:从前序与中序遍历序列构造二叉树
(给算法爱好者加星标,修炼编程内功) 来源: 数据结构和算法-山大王wld 问题描述 今天我们就不做关于双指针的了,我们爬到树上玩会儿,做一道关于二叉树的题.今天的题就一句话,根据一棵树的前序遍历与中 ...
- python快速排序算法循环_算法:快速排序的Python实现
一.概述 快速排序(quick sort)是一种分治排序算法.该算法首先 选取 一个划分元素(partition element,有时又称为pivot):接着重排列表将其 划分 为三个部分:left( ...
- python矩阵组合_用产品组合矩阵平衡您的产品组合
python矩阵组合 产品组合矩阵是一个方便的工具,可以帮助您做出正确的产品组合决策. 这篇文章说明了如何有效地将其用于管理数字产品组合. 重装上阵 产品投资组合矩阵 (也称为增长份额和BCG矩阵)希 ...
- print python excel分隔_合并/拆分 Excel?Python、VBA轻松自动化
作者 | Ryoko 来源 | 凹凸数据 当你收集了 n 个人的 EXCEL 记录表,需要将它们汇成一个总表时你会怎么做呢? 如果不通过技术手段,要一个个打开再复制粘贴也太麻烦了吧! 此时就需要一个通 ...
- python 温度 符号_【火马】Python学习小记01
Python 学习小记 Life is short,you need Python! 写在前面 自从重新拾起2016年开始注册的公众号"火马编程",我就把TA当作了自己的一块&qu ...
最新文章
- 计算机网络技能专项训练一:基础配置
- Android控件布局属性全解(一看就会)
- ElasticSearch-7.10版本最新万字长文教程【距离搞懂ELK核心你只差这一片文章】
- Apache Spark中实现的MapReduce设计模式
- linux ls 命令排序,如何在Linux中使用ls命令按大小对所有文件进行排序
- curl和file_get_contents 区别以及各自的优劣
- 贪吃蛇javascript代码_源于Jquery开发贪吃蛇游戏——简单思路分析总结
- 11gpath失败 oracle_win10安装oracle11g提示path长度不够,该怎样解决?
- Python的类和继承中的属性变量
- unity粒子特效与ui遮盖显示
- 如何搭建一个vue项目(完整步骤)
- 推荐系统中的前沿技术研究与落地:深度学习、AutoML与强化学习 | AI ProCon 2019
- C#: 数字经纬度和度分秒经纬度间的转换
- 解二元一次方程组程序
- 本周AI热点回顾:政府数据将开放共享、生命游戏发明者逝世、百度Apollo对外发布“ACE 交通引擎”
- 最近自己安装CDH5.X版本时发现,CM包和parcels包无法下载了。
- 不能爬小程序,叫什么会爬虫
- trigger()方法
- Ubuntu+Mac使用飞鸽传书iptux进行互通
- css及css3学习