动规part 05

news2024/9/20 15:43:11

LC 518.零钱兑换II

本题是完全背包求组合中的应用

tips:

求组和,先遍历物品,再遍历背包;求排列,先遍历背包,再遍历物品。

将本题和LC 494 对比着看,加深印象。

class Solution:
    def change(self, amount: int, coins: List[int]) -> int:
        dp = [0] * 5001
        dp[0] = 1
        for i in range(len(coins)):
            for j in range(coins[i] , amount + 1):
                dp[j] += dp[j-coins[i]]
        return dp[amount]

Java版本

class Solution {
    public int change(int amount, int[] coins) {
        int[] dp =new int [5001];
        dp[0] = 1;
        for(int i = 0 ; i < coins.length ; i++){
            for(int j = coins[i] ; j <= amount ; j ++){
                dp[j] += dp[j - coins[i]];
            }
        }
    return dp[amount];
    }
}

LC 377. 组合总和 Ⅳ

本题是完全背包求排列的应用,与之前的几个题类似。但是求排列是先遍历背包,再遍历物品!

class Solution:
    def combinationSum4(self, nums: List[int], target: int) -> int:
        dp = [0] * 1001
        dp[0] = 1
        for j in range(0, target + 1):
            for i in range(0,len(nums)):
                dp[j] += dp[j-nums[i]]
        return dp[target]

JAVA版

class Solution {
    public int combinationSum4(int[] nums, int target) {
        int[] dp = new int [target + 1];
        dp[0] = 1;
        for(int j = 0 ; j <= target ; j ++){
            for(int i = 0 ; i < nums.length ; i ++){
                if(j - nums[i] >= 0){
                    dp[j] += dp[j - nums[i]];
                }
            }
        }
        return dp[target];
    }
}

注意,java代码必须先判断 j - nums[i] 是否大于等于零,因为java不像python那样,支持索引为负数。

实际上,python版本的代码也应该判断,因为 j - nums[i]表示的是还未放入物品 i 时,为了等会放进物品 i ,预留nums[ i ]的容量后 ,背包还剩多少容量。负数没有意义,至少得是0.

LC 322. 零钱兑换

本题递推公式需要自己推一遍

容易想到使用数组dp[ j ]代表容量为 j (要凑足j这么多的钱)的背包,最少的硬币数为dp[j]。对于硬币 i ,面值为coins[i] , 没放入它的时候 ,要凑足j - coins[i]这么多钱,最少的硬币数为dp[j - coins[i]],那么要凑足j这么多钱,只需要dp[ j - coins[i]] + 1枚硬币即可!

如何更新dp数组?

我们需要取最小值,也就是 dp = min(dp , dp[ j - coins[i]] + 1) ,这就要求在初始化时,除了dp[0] = 0外,其他位置的元素能多大就多大,以保证数组的更新。

class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        if amount == 0: return 0
        dp = [float('inf')] * (amount + 1)
        dp[0] = 0
        for i in range(len(coins)):
            for j in range(coins[i] , amount + 1):
                dp[j] = min(dp[j] , dp[j - coins[i]] + 1)
        if dp[amount] == float('inf'): return -1
        return dp[amount]

JAVA版

class Solution {
    public int coinChange(int[] coins, int amount) {
        int[] dp = new int[amount + 1];
        for(int i = 1 ; i < dp.length ; i++){
            dp[i] = Integer.MAX_VALUE;
        }
        for(int i = 0 ; i < coins.length ; i ++){
            for(int j = coins[i] ; j <= amount ; j ++){
                if(dp[j - coins[i]] != Integer.MAX_VALUE){
                    dp[j] = Math.min(dp[j] , dp[j-coins[i]] + 1);
                }
                }
            }
        if(dp[dp.length - 1] == Integer.MAX_VALUE){
            return -1;
        }else{
            return dp[amount];
        }
    }
}

tips:

之前没加下面这行代码,导致运行结果出现了一个诡异的数字-2147483648,

这再次体现了JAVA与python的不同,在python版本中,我没有判断下面这行代码,也正确运行得出结果了,这是因为python里的min(dp[j] , dp[j-nums[i]] + 1),若两者都是inf,仍然会保持inf。

而java中,我们设置的是Integer.MAX_VALUE,代表整数中的最大值,此时我们给他 + 1,会导致整数溢出,这在Java中会导致一个负值,这个负值会立即被识别为小于 Integer.MAX_VALUE,所以返回了这个诡异的数字。

因此严谨地考虑,python和java版本中,都应该加入下面这行代码,这表示在构成dp[j] 之前, 有没有dp[ j - coins[ i ]] 这种组合 , 若没有,则不执行更新。

if(dp[j - coins[i]] != Integer.MAX_VALUE)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2149304.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人工智能时代:程序员如何在变革中保持核心竞争力?

随着人工智能生成内容&#xff08;AIGC&#xff09;领域的快速发展&#xff0c;大语言模型如ChatGPT、Midjourney、Claude等层出不穷&#xff0c;AI辅助编程工具迅速普及&#xff0c;程序员的工作方式正在经历翻天覆地的变革。面对这一趋势&#xff0c;有人担心AI可能取代部分编…

嵌入式处理器详解

文章目录 一、CPU、MPU、MCU、SoC、Application Processors的概念1.CPU (Central Processing Unit)2.MPU (Micro Processor Unit)3.MCU (Micro Controller Unit)4.SoC(System on Chip)5.Application Processors 二、哈弗架构与冯诺伊曼架构三、XIP概念四、嵌入式系统硬件组成五…

【架构设计】多级缓存:应用案例与问题解决策略

【架构设计】多级缓存&#xff1a;应用案例与问题解决策略 多级缓存系统的工作原理及其在提升应用性能方面的关键作用。通过对比本地缓存与分布式缓存的特点 | 原创作者/编辑&#xff1a;凯哥Java | 分类&#xff1a;架构设计系列教程 多级缓存…

模拟电路分析基础知识总结笔记(电子电路分析与设计前置知识)

必备条件 电子电路的直流分析电子电路的正弦稳态分析RC电路的瞬态分析戴维南定理和诺顿定理拉普拉斯变换&#xff08;看不懂&#xff0c;根本看不懂&#xff09; 电子电路的直流分析 欧姆定律 ​ 在恒定温度下&#xff0c;电压与电流成正比&#xff0c;电压与电阻成正比&am…

Java-数据结构-优先级队列(堆)-(二) (゚▽゚*)

文本目录&#xff1a; ❄️一、PriorityQueue的常用接口&#xff1a; ➷ 1、PriorityQueue的特性&#xff1a; ➷ 2、使用PriorityQueue的注意&#xff1a; ➷ 3、PriorityQueue的构造&#xff1a; ☞ 1、无参数的构造方法&#xff1a; ☞ 2、有参数的构造方法&#xff1a; …

DCMM介绍

目录 一、介绍 二、核心摘要 三、体系大纲 四、能力评估 1、过程与活动 2、等级判定依据 3、访谈对象 一、介绍 通过阅读本书,您将洞悉国际数据框架体系,并掌握国家对于数据管理能力的权威评估标准与等级划分。本书详尽阐述了数据管理领域的八大核心能力域,以及这八大…

Flask、Werkzeug 和 WSGI 间的关系

一.Flask、Werkzeug和 WSGI 关系 1.WSGI Web 架构 Flask 是一个基于 Werkzeug 和 Jinja2 模板引擎的轻量级 Web 框架。Werkzeug 是 Flask 的底层 WSGI 工具包&#xff0c;它提供了 WSGI 服务器、请求和响应对象、路由等基础功能&#xff0c;Flask 在此基础上构建了更高级的 W…

HelpLook VS GitBook,在线文档管理工具对比

在线文档管理工具在当今时代非常重要。随着数字化时代的到来&#xff0c;人们越来越依赖于电子文档来存储、共享和管理信息。无论是与团队合作还是与客户分享&#xff0c;人们都可以轻松地共享文档链接或通过设置权限来控制访问。在线文档管理工具的出现大大提高了工作效率和协…

性能调优

性能调优 应用程序在运行过程中经常会出现性能问题&#xff0c;比较常见的性能问题现象是&#xff1a; 通过top命令查看CPU占用率高&#xff0c;接近100甚至多核CPU下超过100都是有可能的。请求单个服务处理时间特别长&#xff0c;多服务使用skywalking等监控系统来判断是哪一…

电子束光刻过程中的场拼接精度

以下内容如有错误&#xff0c;请不吝指教&#xff0c;感谢&#xff01; 1、EBL为什么会出现场拼接误差&#xff0c;如何解决&#xff1f; ChatGPT 说&#xff1a; 在电子束光刻&#xff08;EBL&#xff09;过程中&#xff0c;SOI&#xff08;硅绝缘体&#xff09;芯片上出现*…

计算机毕业论文题目:设计与实现一个校园通知信息系统

设计与实现一个校园通知信息系统是一个涉及多个方面的复杂项目&#xff0c;它旨在提高信息传递的效率和准确性&#xff0c;确保学生、教师以及学校管理人员能够及时获取到重要的通知信息。以下是关于如何设计并实现这样一个系统的详细说明&#xff1a; 1. 需求分析 用户…

【高中数学/不等式/数学归纳法/等比数列】证明伯努利不等式(1+h)^n>1+nh的三种方式

【伯努利不等式】 (1h)^n>1nh &#xff08;h>0,n为大于1的自然数&#xff09; 【数学归纳法证法】 证明&#xff1a; n2时&#xff0c;(1h)^212hh^2>12h 不等式成立 n3时&#xff0c;(1h)^313h3h^2h^3>13h 不等式成立 假设nk时&#xff0c;有(1h)^k>…

机房三大网络拓扑图,太实用了

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 下午好&#xff0c;我的网工朋友。 通常来说&#xff0c;机房的三大网络拓扑图指的是星型拓扑、总线型拓扑和环形拓扑。 在实际的机房网络设计中…

vue项目加载cdn失败解决方法

注释index.html文件中 找到vue.config.js文件注释、

MySQL_图形管理工具简介、下载及安装(超详细)

课 程 推 荐我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448;入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448;虚 拟 环 境 搭 建 &#xff1a;&#x1…

【VUE3.0】动手做一套像素风的前端UI组件库---先导篇

系列文章目录 【VUE3.0】动手做一套像素风的前端UI组件库—Button 目录 系列文章目录引言准备素材字体鼠标手势图 创建vue3项目构建项目1. 根据命令行提示选择如下&#xff1a;2. 进入项目根目录下载依赖并启动。3. 设置项目src路径别名&#xff0c;方便后期应用路径。4. 将素…

Debian 12上安装google chrome

当前系统&#xff1a;Debian 12.7 昨天在Debian 12.7上安装Google Chrome时&#xff0c;可能由于网络原因&#xff0c;导入公钥始终失败。 导致无法正常使用命令#apt install google-chrome-stable来安装google chrome; 解决办法&#xff1a; Step1.下载当前google chrome稳…

C++性能优化-代码角度

减少跳转/分支语句和函数调用 原因 分支语句&#xff1a;当 CPU 执行到分支语句时&#xff0c;将会进行分支预测&#xff08;对大部分PC&#xff09;。如果分支预测错误&#xff0c;就会清空已经预取和执行的部分指令&#xff0c;重新从正确的分支开始取指和执行&#xff0c;…

某东-h5st参数逆向分析

目标&#xff1a;商品搜索翻页接口 直接搜索h5st就可以搜到&#xff0c;所有可疑位置都打上断点&#xff0c;然后翻页&#xff0c;最终断点位置&#xff1a; window.PSign.sign(colorParamSign)是异步代码&#xff0c;colorParamSign是传入的参数&#xff0c;执行后把包含h5st…

基于YOLOv5的教室人数检测统计系统

基于YOLOv5的教室人数检测统计系统可以有效地用于监控教室内的学生数量&#xff0c;适用于多种应用场景&#xff0c;比如 自动考勤、安全监控或空间利用分析 以下是如何构建这样一个系统的概述&#xff0c;包括环境准备、数据集创建、模型训练以及如何处理不同类型的媒体输入…