算法系列--动态规划--背包问题(4)--完全背包拓展题目

💕"这种低水平质量的攻击根本就不值得我躲!"💕
作者:Lvzi
文章主要内容:算法系列–动态规划–背包问题(4)–完全背包拓展题目
在这里插入图片描述

大家好,今天为大家带来的是算法系列--动态规划--背包问题(4)--完全背包拓展题目

一.零钱兑换

链接:
https://leetcode.cn/problems/coin-change/submissions/517819340/
在这里插入图片描述

分析:
本题就是一个完全背包问题的体现,完全背包问题最大的特点就是物品的数量是无限制的,在本题中硬币的数量也是无限制的,所以本题依旧可以采用动态规划的思想解决

状态表示:

  • dp[i][j]:在[1,i]区间内的硬币中选择,实现总额为j元的最小硬币组合数

状态转移方程:

初始化:
由于可能无法使用一定组合的硬币实现j元,此时的状态应该为-1,在选择nums[i]这种情况下,为了不使用无效的数据所以我们需要特殊判断一下,目的是不使用无效的数据,那么只要在填表的时候无效数据不会被使用到即可,这里我们求的是两种情况的最小值,如果不想使用无效数据,可以将无效数据设置为0x3f3f3f3f,这样无效数据对我们的初始化就没有影响了

代码:

class Solution {public int coinChange(int[] coins, int amount) {int n = coins.length;int[][] dp = new int[n + 1][amount + 1];// 创建dp表for(int j = 1; j <= amount; j++) dp[0][j] = 0x3f3f3f3f;// 初始化为最大值 for(int i = 1; i <= n; i++) {for(int j = 0; j <= amount; j++) {dp[i][j] = dp[i - 1][j];if(j - coins[i - 1] >= 0)// 不能超过最大容量dp[i][j] = Math.min(dp[i][j],dp[i][j - coins[i - 1]] + 1);}}// 注意这种恰好等于的背包问题  最后的返回值一定要特判一下return dp[n][amount] == 0x3f3f3f3f ? -1 : dp[n][amount];}
}

空间优化:

class Solution {public int coinChange(int[] coins, int amount) {int n = coins.length;int[] dp = new int[amount + 1];// 创建dp表for(int j = 1; j <= amount; j++) dp[j] = 0x3f3f3f3f;// 初始化为最大值 for(int i = 1; i <= n; i++)for(int j = coins[i - 1]; j <= amount; j++)dp[j] = Math.min(dp[j],dp[j - coins[i - 1]] + 1);// 注意这种恰好等于的背包问题  最后的返回值一定要特判一下return dp[amount] == 0x3f3f3f3f ? -1 : dp[amount];}
}

思考的难点:

  1. 如何通过设置无效的数据来进行初始化,在选nums[i]这种情况时,我们之所以要判断一下是为了不使用符合该条件的数据(无效数据 -1),我们这里求的是最小值,只需要保证在填数据的时候不使用就行,那么就可以将无效数据设置为最大值,这样就不会使用到无效数据了

2.零钱兑换II

链接:
https://leetcode.cn/problems/coin-change-ii/

分析:

本题就是统计情况数

这道题就是完全背包版本的
目标和

代码:

class Solution {public int change(int amount,int[] coins) {int n = coins.length;int[][] dp = new int[n + 1][amount + 1];// 创建dp表dp[0][0] = 1;// 初始化// 填表for(int i = 1; i <= n; i++) {for(int j = 0; j <= amount; j++) {dp[i][j] = dp[i - 1][j];if(j - coins[i - 1] >= 0)dp[i][j] += dp[i][j - coins[i - 1]];}}return dp[n][amount];}
}

空间优化:

class Solution {public int change(int amount,int[] coins) {int n = coins.length;int[] dp = new int[amount + 1];// 创建dp表dp[0] = 1;// 初始化// 填表for(int i = 1; i <= n; i++)for(int j = coins[i - 1]; j <= amount; j++)dp[j] += dp[j - coins[i - 1]];return dp[amount];}
}

三.完全平方数

链接:
https://leetcode.cn/problems/perfect-squares/
在这里插入图片描述

分析:

本题分析下来,要完成的操作就是使用尽可能少的完全平方数表示n,每个完全平方数的数目是无限制的(挑选的物品无限制就很有可能是完全背包问题)

在这里插入图片描述
注意这里最重要返回的结果是组合数最少的,其余的思路和完全背包问题一致,不做过多的讲解

class Solution {public int numSquares(int n) {int m = (int)Math.sqrt(n);// 求出数组的长度int[][] dp = new int[m + 1][n + 1];// 创建dp表for(int j = 1; j <= n; j++) dp[0][j] = 0x3f3f3f3f;// 初始化for(int i = 1; i <= m; i++) {for(int j = 1; j <= n; j++) {dp[i][j] = dp[i - 1][j];if(j - i * i >= 0)dp[i][j] = Math.min(dp[i][j],dp[i][j - i * i] + 1);}}return dp[m][n];}
}

空间优化后的代码

class Solution {public int numSquares(int n) {int m = (int)Math.sqrt(n);// 求出数组的长度int[] dp = new int[n + 1];// 创建dp表for(int j = 1; j <= n; j++) dp[j] = 0x3f3f3f3f;// 初始化for(int i = 1; i <= m; i++)for(int j = i * i; j <= n; j++)dp[j] = Math.min(dp[j],dp[j - i * i] + 1);return dp[n];}
}

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

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

相关文章

计算机图形学和OpenGL

一.计算机图形学和OpenGL的推荐书籍&#xff1a; 1. **OpenGL编程指南&#xff08;第九版&#xff09;**&#xff08;OpenGL Programming Guide, Ninth Edition&#xff09;&#xff1a;这本书是学习OpenGL编程的经典教材&#xff0c;详细介绍了OpenGL的基础知识和高级技术&…

《web应用技术》第一次课后练习

上机任务&#xff08;利用好chatgpt&#xff0c;文心一言等工具。&#xff09;&#xff1a; 1、下载软件&#xff0c;并安装。相关安装文件已上传至群文件。 JDK,TOMCAT&#xff0c;IDEA 2、学会用记事本编写jsp文件&#xff0c;并放进tomcat的相关目录下&#xff0c;运行。 …

使用Windows自带服务(BitLocker)加密U盘

第一步&#xff1a;启用 BitLocker 服务 1.1快捷键&#xff1a;WinR 调出运行框&#xff0c;输入services.msc 1.2找到服务列表中的BitLocker Drive Encryption Service&#xff0c;启动此项 第二步&#xff1a;加密U盘 把你的U盘插入电脑&#xff0c;打开“我的电脑”&#…

EFCore的空迁移(EFCore操作已存在的数据库表,不影响其中的数据)

背景&#xff1a;EFCore默认的会自动创建数据表&#xff0c;但是有时又是DBFirst&#xff0c;数据库写好了要用现成的表。这个时候就需要进行一些特殊的操作了 1、写出跟要对接数据库的实体类 比如我的表是这样创建的 create table mail_test (user_id bigint auto_increment …

java普通类和抽象类有哪些区别?

普通类和抽象类在面向对象编程中有一些显著的区别&#xff0c;这些区别主要体现在类的定义、使用方式和实例化等方面。以下是它们之间的一些主要区别&#xff1a; 定义与实现&#xff1a; 普通类&#xff1a;普通类可以包含非抽象方法和抽象方法&#xff08;如果有的话&#x…

OSCP靶场--Twiggy

OSCP靶场–Twiggy 考点(CVE-2020-11651[RCE]) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.216.62 -sV -sC -Pn --min-rate 2500 -p- Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-30 06:43 EDT Nmap scan report for 192.168.216.62 Host i…

MongoDB聚合运算符:$ln

文章目录 MongoDB聚合运算符&#xff1a;$ln语法使用举例 MongoDB聚合运算符&#xff1a;$ln $ln聚合运算符计算数字的自然对数ln&#xff08;即 log e&#xff09;并将结果作为双精度值返回。 语法 { $ln: <number> }<number>表达式可以是任何有效的表达式&…

Hive常用函数_20个字符串处理

Hive常用函数_20个字符串处理 以下是Hive中常用的字符串处理函数&#xff0c;可用于执行各种字符串处理转换操作。 1. CONCAT()&#xff1a;将多个字符串连接在一起。 SELECT CONCAT(Hello, World); -- Output: HelloWorld2. SUBSTR()&#xff1a;从字符串中提取子字符串&…

基础拓扑排序

前言 拓扑排序是一种针对“有向无环图”的算法&#xff0c;用于解决一些有“依赖关系”的问题。 拓扑排序保证了当处理到某个电时&#xff0c;其所有的如电都已经处理过了。 例如右边这个图&#xff0c;拓扑序可以保证处理点2之前&#xff0c;点4和点6都处理过了、处理点3之…

IDEA的使用(概念,安装,配置,)以及什么是字符集,模版

目录 Intellij IDEA IDE的概念 IntelliJ IDEA的安装 IntelliJ IDEA的使用 基本配置 JDK配置 创建Module 基本用法 字体配置 主题配置 字符集 设置IDEA默认字符集 注释模板 字符集 字符集简介 常见字符集 Intellij IDEA 我们不可能一直使用记事本之类变成&#…

Vue PostCSS的使用介绍

PostCSS postcss 一种对css编译的工具&#xff0c;类似babel对js的处理&#xff0c;常见的功能如&#xff1a; 1 . 使用下一代css语法 2 . 自动补全浏览器前缀 3 . 自动把px代为转换成rem 4 . css 代码压缩等等 使用 创建好项目并且初始化npm init -y 创建一个页面&…

深入解析Oracle数据库merge

概念 Oracle数据库中的MERGE语句是一种强大的DML&#xff08;Data Manipulation Language&#xff09;操作&#xff0c;它允许用户在一个单一的SQL语句中根据特定的条件同时执行INSERT、UPDATE以及在某些情况下还包括DELETE操作。MERGE语句的核心功能是根据源数据&#xff08;…

何恺明重提十年之争——模型表现好是源于能力提升还是捕获数据集偏置?

想象一下&#xff0c;如果把世界上所有的图片都找来&#xff0c;给它们放到一块巨大的空地上&#xff0c;其中内容相似的图片放得近一些&#xff0c;内容不相似的图片放得远一些&#xff08;类比向量嵌入&#xff09;。然后&#xff0c;我随机地向这片空地撒一把豆子&#xff0…

Vue3+Vite+Axios Request 请求封装(TS版本)最新

Vue3ViteAxios Request 请求封装&#xff08;TS版本&#xff09; http > index.ts 请求封装 /** Date: 2024-03-30 12:37:05* LastEditors: zhong* LastEditTime: 2024-03-30 14:12:52* FilePath: \app-admin\src\http\index.ts*/ import axios, { AxiosInstance, AxiosRequ…

【C#】知识点速通

前言&#xff1a; 笔者是跟着哔站课程&#xff08;Trigger&#xff09;学习unity才去学习的C#&#xff0c;并且C语言功底尚存&#xff0c;所以只是简单地跟着课程将unity所用的C#语言的关键部分进行了了解&#xff0c;然后在后期unity学习过程中加以深度学习。如需完善的C#知识…

码支付个人支付宝永不掉线使用教程

​支付宝免CK添加操作稍微繁琐点&#xff0c;请耐心观看 此通道必须关闭你的余额宝自动转入功能&#xff0c;否则可能造成不跳转 支付宝添加的所有通道均支持H5免输入收款 第一步&#xff1a;打开支付宝开发平台&#xff0c;然后用你的支付宝注册登陆&#xff1a;https://op…

pytest中文使用文档----10skip和xfail标记

1. 跳过测试用例的执行 1.1. pytest.mark.skip装饰器1.2. pytest.skip方法1.3. pytest.mark.skipif装饰器1.4. pytest.importorskip方法1.5. 跳过测试类1.6. 跳过测试模块1.7. 跳过指定文件或目录1.8. 总结 2. 标记用例为预期失败的 2.1. 去使能xfail标记 3. 结合pytest.param方…

算法学习——LeetCode力扣动态规划篇5

算法学习——LeetCode力扣动态规划篇5 198. 打家劫舍 198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统…

C语言如何进⾏函数的嵌套调⽤?

一、问题 C语⾔中不允许进⾏嵌套的函数定义&#xff0c;因此各函数之间是平⾏的&#xff0c;不存在上⼀级函数和下⼀级函数的问题。但是C语⾔允许在⼀个函数的定义中出现对另⼀个函数的调⽤&#xff0c;这就是函数嵌套调⽤。那么如何嵌套调⽤呢&#xff1f; 二、解答 函数的嵌…

python学习16:python中的布尔类型和条件语句的学习

python中的布尔类型和条件语句的学习 1.布尔&#xff08;bool&#xff09;类型的定义&#xff1a; 布尔类型的字面量&#xff1a;True表示真&#xff08;是、肯定&#xff09; False表示假&#xff08;否、否定&#xff09; True本质上是一个数字记作1&#xff0c;False记作0 …