【经典算法题】零钱兑换_java 兑换零钱算法-程序员宅基地

技术标签: 背包问题  动态规划  经典算法题  

【经典算法题】零钱兑换

Leetcode 0322 零钱兑换

题目描述:Leetcode 0322 零钱兑换

在这里插入图片描述

分析

  • 本题的考点:背包问题

  • 完全背包问题,amout为容量;物品体积为coins[i],价值为1

  • 本题和Leetcode 0279 完全平方数十分类似,可以参考LC279的分析。

  • 注意本题和Leetcode 0518 零钱兑换 II的区别,LC518让求得是体积恰好是m的方案数,本题求的是体积恰好是m需要用的最少硬币数。

代码

  • C++
class Solution {
    
public:
    int coinChange(vector<int> &coins, int m) {
    

        vector<int> f(m + 1, 1e8);
        f[0] = 0;
        for (auto v : coins)
            for (int j = v; j <= m; j++)
                f[j] = min(f[j], f[j - v] + 1);
        if (f[m] == 1e8) return -1;
        return f[m];
    }
};
  • Java
class Solution {
    
    public int coinChange(int[] coins, int m) {
    

        int[] dp = new int[m + 1];
        Arrays.fill(dp, m + 1);
        dp[0] = 0;
        for (int v : coins)
            for (int j = v; j <= m; j++)
                dp[j] = Math.min(dp[j], dp[j - v] + 1);
        return dp[m] == m + 1 ? -1 : dp[m];
    }
}

时空复杂度分析

  • 时间复杂度: O ( n × m ) O(n \times m) O(n×m)n为不同面值的硬币数,m为总金额。

  • 空间复杂度: O ( m ) O(m) O(m)

Leetcode 0518 零钱兑换 II

题目描述:Leetcode 0518 零钱兑换 II

在这里插入图片描述

分析

  • 本题的考点:背包问题

  • 本题将amout简记为m。问题是:给我们一个容量为m的背包,每个物品的体积由coins给出,每个物品可以使用无数次,问恰好装满背包的方案数。

  • 本题就是一个完全背包问题。关于背包问题可以参考:背包问题(背包九讲)

  • 注意本题和Leetcode 0322 零钱兑换的区别,LC322让求的是体积恰好是m需要用的最少硬币数,本题求得是体积恰好是m的方案数,还有一类最常规的让求最大价值(体积不超过m的最大价值,体积恰好是m的最大价值,体积不小于m的最小耗费)。

  • 另外注意本题和Leetcode 0377 组合总和 Ⅳ,和本题的唯一区别在于,认为1,22,1是不同的方案。因此LC377先循环体积,再循环物品,这样对于每个体积,可以根据最后一个放入的数据分为n类,因此可以实现不同顺序是不同方案。完全背包最初的分析(见背包九讲的分析),是每个物品放置几个数据,因此不同顺序认为是相同方案。

代码

  • C++
class Solution {
    
public:
    int change(int m, vector<int>& coins) {
    
        vector<int> f(m + 1);
        f[0] = 1;
        for (int v : coins)
            for (int j = v; j <= m; j++)
                f[j] += f[j - v];
        return f[m];
    }
};
  • Java
class Solution {
    
    public int change(int m, int[] coins) {
    
        int[] f = new int[m + 1];
        f[0] = 1;
        for (int v : coins)
            for (int j = v; j <= m; j++)
                f[j] += f[j - v];
        return f[m];
    }
}
  • Python
class Solution:
    def change(self, m: int, coins: List[int]) -> int:
        f = [0 for _ in range(m + 1)]
        f[0] = 1
        for v in coins:
            for j in range(v, m + 1):
                f[j] += f[j - v];
        return f[m]

时空复杂度分析

  • 时间复杂度: O ( n × m ) O(n \times m) O(n×m)n为数组长度,m是题目中的amout

  • 空间复杂度: O ( n × m ) O(n \times m) O(n×m)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42638946/article/details/121962658

智能推荐

Numpy常用random随机函数_numpy random-程序员宅基地

文章浏览阅读5.8k次,点赞7次,收藏35次。只要random.seed( * ) seed里面的值一样,那随机出来的结果就一样。所以说,seed的作用是让随机结果可重现。也就是说当我们设置相同的seed,每次生成的随机数相同。如果不设置seed,则每次会生成不同的随机数。使用同一个种子,每次生成的随机数序列都是相同的。_numpy random

旺旺老师JavaSE基础第一章(01)Java介绍-程序员宅基地

文章浏览阅读424次。视频地址:http://v.youku.com/v_show/id_XNjI3NjMzOTI4.html?f=20609548_旺旺老师javase

一天一天学 windows phone 控件 之 TextBox + PasswordBox (十六)_windows控件taxtbox password-程序员宅基地

文章浏览阅读1.8k次。先从 TextBox 控件 说起,TextBox控件是输入框,类似于html中的 标签,_windows控件taxtbox password

带有Spring Cloud Config和JHipster的Java微服务-程序员宅基地

文章浏览阅读100次。朋友不允许朋友写用户身份验证。 厌倦了管理自己的用户? 立即尝试Okta的API和Java SDK。 在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护。 如今,使用Java和Spring Boot开发微服务架构非常流行。 它绝对是Java生态系统中最受欢迎的组合之一。 如果需要任何证据,只需看看过去几年出现的所有类似框架:MicroProfile,Micronaut和Quar..._jhipster mvn jib

【软件安装】(十二)MATLAB R2023b完整安装教程(附安装包)_matlab2023b-程序员宅基地

文章浏览阅读6.9w次,点赞325次,收藏700次。一个愿意伫立在巨人肩膀上的农民......_matlab2023b

server启动故障:com.ibm.ws.exception.RuntimeError-程序员宅基地

文章浏览阅读1.3k次。问题描述:在做了配置变更之后,server启动不起来。还原配置,依然存在这启动故障。this is the log :[8/23/15 12:09:20:276 CST] 00000001 WsServerImpl E WSVR0009E: Error occurred during startupcom.ibm.ws.exception.RuntimeError: o..._关键点恢复期间捕捉到异常!com.ibm.ws.recoverylog.spi.internallogexception

随便推点

【小程序】快来开发你的第一个微信小游戏(详细流程)_微信小游戏开发-程序员宅基地

文章浏览阅读7.5w次,点赞145次,收藏787次。本文通过开发一个简单的小游戏,来带领大家实操一下开发小游戏的基本流程。快来和博主一起操作吧!!!_微信小游戏开发

【Java用法】Spring之@Nullable和@NotNull注释的使用_java @nullable-程序员宅基地

文章浏览阅读1.7w次,点赞16次,收藏17次。@NonNull 注解可以标注在方法、字段、参数之上,表示对应的值不能为空; @Nullable 注解可以标注在方法、字段、参数之上,表示对应的值可以为空;如果可以传入 NULL 值,则标记为 @Nullable,如果不可以,则标注为 @NonNull。那么在做一些不安全严谨操作的编码时,这些注释会给我们一些警告。如下是我看 Spring 源码(DelegatingEntityResolver 类)时,发现用到的 @Nullable。以上图片中关于修改的地方是把 Spring 源码里的空行._java @nullable

SitePoint播客#61:HTML5 =厨房水槽-程序员宅基地

文章浏览阅读554次。Episode 61 of The SitePoint Podcast is now available! This week your hosts are Patrick O’Keefe (@iFroggy), Stephan Segraves (@ssegraves), and Kevin Yank (@sentience). SitePoint Podcast的 第61集现已发布! 本周的...

反病毒引擎设计-程序员宅基地

文章浏览阅读775次。反病毒引擎设计创建时间:2003-10-02文章属性:转载文章提交:NJUE (admin_at_ourmm.com)本文将对当今先进的病毒/反病毒技术做全面而细致的介绍,重点当然放在了反病毒上,特别是虚拟机和实时监控技术。文中首先介绍几种当今较为流行的病毒技术,包括获取系统核心态特权级,驻留,截获系统操作,变形和加密等。然后分五节详细讨论虚拟机技术:第一节简单介绍一下虚拟

此blog停止更新,请访问最新域名_域名访问升级紧急中拿笔记好-程序员宅基地

文章浏览阅读1w次。此blog停止更新,请访问最新域名 http://blog.lokizone.com_域名访问升级紧急中拿笔记好

角色控制器 (Character Controller)_charactercontroller-程序员宅基地

文章浏览阅读1.1w次,点赞8次,收藏23次。角色控制器 (Character Controller)一、简介角色控制器(Character Controller)主要用于对第三人称或第一人称游戏主角的控制。如果要创建类人角色,可使用角色控制器 (Character Controller)。这可以是第三人称游戏 (Third Person Platformer) 中的主角色、FPS 射击者或任何敌人角色。二、基本概念第三人称游戏中的这..._charactercontroller

推荐文章

热门文章

相关标签