首页 > 编程语言 >算法题总结-找零钱

算法题总结-找零钱

时间:2023-06-09 17:24:35浏览次数:30  
标签:总结 arr int Wi aim 零钱 算法 result pass

原题

给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数。
如果无解,请返回-1.
数据范围:数组大小满足 0 \le n \le 100000≤n≤10000 , 数组中每个数字都满足 0 < val \le 100000<val≤10000,0 \le aim \le 50000≤aim≤5000
要求:时间复杂度 O(n \times aim)O(n×aim) ,空间复杂度 O(aim)O(aim)。
输入示例:


[5,2,3],20

输出示例:


4

核心转移方程:


F[v] = min(F[v − Wi])+1

方程就一个意思,v元的组合,可以划分为,按照每种面值的钱都减少一张Wi,v-Wi元的最优解,最后再补上减少的一张钱即可得到最终答案

基本实现用递归即可,初始化最小面额之下的最优组合即可,不是0就是-1

需要关注的点:
1、如果面额减少一张以后,v-Wi 为负数,则跳过该种情况
2、如果 F[v − Wi] 为负数,则跳过该种情况,因为没有合法情况
3、在遍历完所有面值的情况,没有合法情况,即返回-1


#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 最少货币数
# @param arr int整型一维数组 the array
# @param aim int整型 the target
# @return int整型
#
class entity:
    def __init__(self,N:int) -> None:
        self.F = [-1 for i in range(N+1)]
        self.F[0] = 0
        pass
    pass
class Solution:
    def minMoney(self , arr: List[int], aim: int) -> int:
        # write code here
        result = entity(aim)
        if len(arr)==0:
            return -1
        minValue = min(arr)
        for iterNum in range(1,aim+1):
            if iterNum<minValue:
                # 小于最小面额时 全部都是-1
                result.F[iterNum]=-1
                pass
            else:
                # 大于最小面额时 利用递归公式
                # F[n] = min(F[n-arr[j]]) + 1
                F_tmp_list = []
                for item in arr:
                    aim_temp = iterNum-item
                    if aim_temp<0:
                        continue
                    F_temp = result.F[aim_temp]
                    if F_temp>=0:
                        F_tmp_list.append(F_temp)
                    pass
                if len(F_tmp_list)>0:
                    result.F[iterNum]=min(F_tmp_list)+1
                else:
                    result.F[iterNum] = -1
                pass
            pass
        return result.F[aim]

标签:总结,arr,int,Wi,aim,零钱,算法,result,pass
From: https://www.cnblogs.com/dengliang356a/p/17469759.html

相关文章

  • Linux 命令总结
    实用Linux命令总结Linux关机,重启# 关机shutdown -h now# 重启shutdown -r now查看系统,CPU信息# 查看系统内核信息uname -a# 查看系统内核版本cat /proc/version# 查看当前用户环境变量envcat /proc/cpuinfo# 查看有几个逻辑cpu, 包括cpu型号cat /proc/cpu......
  • 算法刷题记录:P1563 [NOIP2016 提高组] 玩具谜题
    题目链接https://www.luogu.com.cn/problem/P1563题目分析既然是环形问题,那么直接取模来进行模拟即可,注意顺时针和逆时针顺时针的箭头是向左拐,是+,逆时针的箭头是向右拐,是-AC代码//Problem:P1563[NOIP2016提高组]玩具谜题//Contest:Luogu//URL:https://www.luo......
  • CVS 用法总结(zz)
    这里有份CVS中文手册http://man.chinaunix.net/develop/cvsdoc_zh/index.html#Topcvs用法总结(1)--cvs命令格式,标志字符和环境cvs用法总结(1)--cvs命令格式读书笔记,中文名"版本控制之道-使用cvs",英文名"PragmaticVersionControl-UsingCVS"。以下内容......
  • 【翻译】使用深度强化学习发现更快的排序算法
    目录Fastersortingalgorithmsdiscoveredusingdeepreinforcementlearning将算法表示为低级CPU指令DRLfordiscoveringfasteralgorithmsTransformerencoderLatencyvaluefunctionsResultsDiscoveringfastersortalgorithmsFixedsortingalgorithmsVariablesorting......
  • 总结整理大全,69个后端技术头大问题
    总结到位:https://blog.csdn.net/JavaShark/article/details/125912023 前言:工欲善其事,必先利其器;士欲宣其义,必先读其书。后台开发作为互联网技术领域的掌上明珠,一直都是开发者们的追逐的高峰。本文将从后台开发所涉及到的技术术语出发,基于系统开发、架构设计、网络通信等几个方......
  • (转)七年老运维实战中的 Shell 开发经验总结
    原文:https://mp.weixin.qq.com/s/0VmbKcttZ0aKpVRb65ycew无论是系统运维,还是应用运维,均可分为“纯手工”—>“脚本化”—>“自动化”—>“智能化”几个阶段,其中自动化阶段,主要是将一些重复性人工操作和运维经验封装为程序或脚本,一方面避免重复性操作及风险,另一方面提高执行效率......
  • 【技术积累】算法中的动态规划【二】
    动态规划的优缺点是什么? 动态规划的优点是:可以解决一些复杂的问题,例如背包问题、最长公共子序列问题等;可以通过记忆化搜索来避免重复计算,提高效率;可以通过状态转移方程来简化问题,使问题更易于理解和解决;可以处理连续的问题,例如最大子段和问题。动态规划的缺点是:对于某......
  • 密码学(4):常见对称算法
    叨两句密码系列文章,是对接第三方接口时接触到加解密,但是知识体系较乱。希望能整理常见证书、密钥、加解密方式这方面知识,用于简单理解和快速区分。有些缺漏和待补充,后续慢慢完善。有任何问题欢迎提出,便于及时修正前言块加密(分组加密):加密算法无法一次性处理过长的明文,这种情况......
  • 密码学(5):常见非对称加密算法
    叨两句密码系列文章,是对接第三方接口时接触到加解密,但是知识体系较乱。希望能整理常见证书、密钥、加解密方式这方面知识,用于简单理解和快速区分。有些缺漏和待补充,后续慢慢完善。有任何问题欢迎提出,便于及时修正1.RSA算法1.介绍2.依赖的数学原理1)将两个大素数相乘十分容......
  • 路由算法
    一、RIP算法——内部网关协议1.路由选择:基于距离向量,所以选择的是路由数最少得路径,而不一定是代价最小的路径2.适用于小型互联网,允许一条路径最多只能包含15个路由器,当距离等于16时,表示不可达。3.交换信息的特点:仅和相邻路由器交换信息,交换全部路由,按固定的时间间隔交换路由4.......