当前位置: 首页 > news >正文

代码随想录算法训练营第44天 || 完全背包 || 518. 零钱兑换 II || 377. 组合总和 Ⅳ

代码随想录算法训练营第44天 || 完全背包 || 518. 零钱兑换 II || 377. 组合总和 Ⅳ

完全背包

完全背包与01背包的区别在于每种物品都有无限件,可以多次放入背包。

我们回顾一下01背包的遍历顺序,其中内层遍历背包的过程要后序遍历,为什么当时一定要后序呢?

  • 因为我们的递推公式 dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);要求的当前节点数据用到的是前面的节点,我们后序遍历就能保证用到的前面节点是还没考虑放入当前物品i的情况。
  • 如果我们使用正序遍历,那么前面的物品已经放入物品i了,那么就会导致再放一次物品i,也就违背了01背包的前提

由此,我们可以发现背包正序遍历可以实现多重背包问题,因为我们遍历容量是逐一递增的,所以每次递增最多也就多放一个物品i,不会出现说背包循环走一步可以放多个物品i,毕竟我们默认物品i重量是≥1的,<1的不考虑,应该也不会这么出题。

一些注意点:

  1. 一维dp数组实现的完全背包问题中,遍历背包和物品顺序可不可以调换?

    • 可以
    • 如果先遍历物品,后遍历背包。意味着每次遍历到下一个背包都去尝试是否能再放物品i,而不用管物品i在前一状态有没有被放过
    • 如果先遍历背包,后遍历物品。意味着,一个个背包塞到最大价值再给下一个背包实现最大价值,后面的背包肯定会使用到前面背包的状态,这样也就会出现一些物品会被放多次的情况,并且每个背包都尽可能放入最大价值
  2. 现在我们回过头去思考此前01背包中,先遍历背包后遍历物品会怎么样?

    这里我们肯定还是得保持背包后序遍历,这样的话一开始前面的背包都是清空状态,无法给最大的背包提供有效信息,它最终不一定能放最大价值,往后讨论也就没有意义了。

  3. **注意注意:**先遍历物品得到的是组合;先遍历背包得到的是排列。在下面两题求解背包装满的方法数量有所体现。

代码:(01背包在遍历顺序上做了小调整)

//先遍历物品,再遍历背包
private static void testCompletePack(){int[] weight = {1, 3, 4};int[] value = {15, 20, 30};int bagWeight = 4;int[] dp = new int[bagWeight + 1];for (int i = 0; i < weight.length; i++){ // 遍历物品for (int j = weight[i]; j <= bagWeight; j++){ // 遍历背包容量dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]);}}for (int maxValue : dp){System.out.println(maxValue + "   ");}
}//先遍历背包,再遍历物品
private static void testCompletePackAnotherWay(){int[] weight = {1, 3, 4};int[] value = {15, 20, 30};int bagWeight = 4;int[] dp = new int[bagWeight + 1];for (int i = 1; i <= bagWeight; i++){ // 遍历背包容量for (int j = 0; j < weight.length; j++){ // 遍历物品if (i - weight[j] >= 0){dp[i] = Math.max(dp[i], dp[i - weight[j]] + value[j]);}}}for (int maxValue : dp){System.out.println(maxValue + "   ");}
}

518. 零钱兑换 II

题目介绍

给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。

请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0

假设每一种面额的硬币有无限个。

题目数据保证结果符合 32 位带符号整数。

示例 1:

输入:amount = 5, coins = [1, 2, 5]
输出:4
解释:有四种方式可以凑成总金额:
5=5
5=2+2+1
5=2+1+1+1
5=1+1+1+1+1

示例 2:

输入:amount = 3, coins = [2]
输出:0
解释:只用面额 2 的硬币不能凑成总金额 3 。

示例 3:

输入:amount = 10, coins = [10] 
输出:1

个人思路:

本题很明显是背包问题,最大容量为amount,要我们求装满背包的最多方案,此外我们发现物品可以重复放入,故而这是一个完全背包问题。

动规五部曲

  1. 确定dp数组及其下标含义

    int[] dp = new int[amount + 1];
    //dp[j] 表示 容量为j的背包装满的方法 此题吧面额和重量看成一样
    
  2. 确定递推公式

    dp[j] += dp[j - coins[i]];
    

    还是放与不放物品i的问题引入,装满容量为j的背包的方法 =已知方法数量 + 装满容量j拿出一个物品i的容量的背包的方法数量

  3. 初始化dp数组

    dp[0] = 1;计算装满方法,统一操作了。

  4. 遍历顺序确定

    • 虽然我们前面说完全背包求最大价值两次for循环可以调换顺序,但在这里不可以调换顺序,这里求的是组合方法,放满的方法数量。

    • 先遍历物品,这种情况是组合情况

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3RYchxMU-1676306021084)(C:\Users\耿飞扬\AppData\Roaming\Typora\typora-user-images\image-20230214001843020.png)]

    • 先遍历背包,这种情况会出现排列的情况,以遍历到背包3举例,

      • 遍历物品1时,找到物品2,得到11 1、2 1两种情况
      • 遍历物品2时,找到物品1,得到1 2一种情况
      • 所以得到排列数情况

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xtPSDG7D-1676306021085)(C:\Users\耿飞扬\AppData\Roaming\Typora\typora-user-images\image-20230214002731595.png)]

    • 背包要正序遍历

  5. 打印dp数组检验

代码

class Solution {public int change(int amount, int[] coins) {int[] dp = new int[amount + 1];//dp[j] 表示 容量为j的背包装满的方法 此题吧面额和重量看成一样dp[0] = 1;for (int i = 0; i < coins.length; i++) {for (int j = 1; j <= amount; j++) {if (j - coins[i] >= 0)dp[j] += dp[j - coins[i]];}}return dp[amount];}
}

377. 组合总和 Ⅳ

题目介绍

给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。

题目数据保证答案符合 32 位整数范围。

示例 1:

输入:nums = [1,2,3], target = 4
输出:7
解释:
所有可能的组合为:
(1, 1, 1, 1)
(1, 1, 2)
(1, 2, 1)
(1, 3)
(2, 1, 1)
(2, 2)
(3, 1)
请注意,顺序不同的序列被视作不同的组合。

示例 2:

输入:nums = [9], target = 3
输出:0

个人思路

原本这题是没写出来的,上一题可以说是碰巧过的吧,没有仔细思考排列组合受到循环内外层调换的影响。

上一题理清之后,本题就直接过了。思路也不过多阐述了,直接上代码,具体见上一题思路解析

class Solution {public int combinationSum4(int[] nums, int target) {int[] dp = new int[target + 1];//dp[j]:背包容量为j的背包装满的方法为dp[j]//初始化dp[0] = 1;for (int j = 1; 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];}
}

相关文章:

代码随想录算法训练营第44天 || 完全背包 || 518. 零钱兑换 II || 377. 组合总和 Ⅳ

代码随想录算法训练营第44天 || 完全背包 || 518. 零钱兑换 II || 377. 组合总和 Ⅳ 完全背包 完全背包与01背包的区别在于每种物品都有无限件&#xff0c;可以多次放入背包。 我们回顾一下01背包的遍历顺序&#xff0c;其中内层遍历背包的过程要后序遍历&#xff0c;为什么…...

【Bug】SQL无法绑定由多个部分组成的标识符

文章目录问题原因解决拓展问题 执行sql报&#xff1a;无法绑定由多个部分组成的标识符 原因 取了别名却没用别名&#xff0c;如下面这些情况 select * from biz_production_order_work_detail temp where biz_production_order_work_detail.create_time>2023-02-13selec…...

Games102 学习笔记

Games 102 P2 数据拟合 拟合数据的好坏 分段线性插值函数yf1(x)yf_1(x)yf1​(x)&#xff0c;数据误差为0&#xff0c;只有C0C_0C0​连续。光滑插值函数yf2(x)yf_2(x)yf2​(x)&#xff0c;数据误差为0&#xff0c;可能被Noice带歪&#xff0c;导致函数性质不好&#xff0c;预…...

知识图谱基本知识点以及应用场景

近两年来&#xff0c;随着Linking Open Data等项目的全面展开&#xff0c;语义Web数据源的数量激增&#xff0c;大量RDF数据被发布。互联网正从仅包含网页和网页之间超链接的文档万维网(Document Web)转变成包含大量描述各种实体和实体之间丰富关系的数据万维网(Data Web)。在这…...

IDEA中常用的快捷键

IDEA中常用的快捷键 自动修正&#xff1a;ALT回车键 代码格式化&#xff1a;CTRLALTL 代码提示&#xff1a;CTRLALT空格 导入当前代码所需要的类&#xff1a;alt回车键 导入当前类中所需要的所有类&#xff1a;ctrlshifto 查看子类&#xff1a;ctrlh 查找类&#xff1a;ctrln …...

朗润国际期货招商:桥水基金四季度投资组合

桥水基金四季度投资组合 总持仓市值183.2亿美元&#xff1b;环比减少7.3% ishares标普500指数ETF&#xff1a;7.93亿占持仓4.33%环比1.14%宝洁&#xff1a;7.57亿占持仓4.13%环比-0.1%新兴市场core TEF-ishares&#xff1a;6.80亿占持仓3.71%环比0.47%强生&#xff1a;6.3亿占…...

Linux管道命令(pipe)全

目录 选取命令&#xff1a;cut、grep 传送门 排序命令&#xff1a;sort、wc、uniq 传送门 双向重定向&#xff1a;tee 字符转换命令&#xff1a;tr、col、join、paste、expand 传送门 划分命令&#xff1a;split 传送门 参数代换&#xff1a;xargs 传送门 关于减号…...

mybatis条件构造器(一)

mybatis条件构造器(一) 1 准备工作 1.1 建表sql语句(Emp表) SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0; -- ---------------------------- -- Table structure for emp -- ---------------------------- DROP TABLE IF EXISTS emp; CREATE TABLE emp (EMPNO int NOT N…...

车联网之电子围栏中ConnectStreamed应用【二十】

文章目录 1. 电子围栏中ConnectStreamed应用1.1 ConnectedStreams简介1.1.1 connect流说明1.1.2 connect流使用场景1.2 Broadcast+Connect+CoFlatmap+CoMap整合实战1.3 两点之间球面距离计算1.4 电子围栏中自定义对象实现CoFlatMap函数1. 电子围栏中ConnectStreamed应用 1.1 C…...

临时文件tempfile

临时文件tempfile 1.概述 安全地创建具有唯一名称的临时文件&#xff0c;以至于他们不会被那些想破坏或者窃取数据的人猜出是非常有挑战性的。tempfile 模块提供了几个安全地创建系统临时文件的方法。 TemporaryFile() 打开并返回一个未命名的临时文件&#xff0c; NamedTemp…...

vue3封装数值动态递增组件

vue3封装数值动态递增组件前言源码举个例子&#xff1a;前言 1&#xff09;使用技术&#xff1a; vue3.2 Ts 2&#xff09;组件接收参数&#xff1a; 参数类型意义是否可选valuenumber数值大小必填durationnumber递增动画持续时间&#xff08;单位&#xff1a;s&#xff09;…...

JavaWeb_RequestResponse

目录 一、概述 二、Request对象 1.Request继承体系 2.Request获取请求数据 ①获取请求行数据 ②获取请求头数据 ③获取请求体数据 ④获取请求参数 3.Request请求转发 三、Response 1.Response设置响应数据功能 ①响应行 ②响应头 ③响应体 2.请求重定向 3.路径问…...

C语言刷题——“C”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰要巩固一下之前学过的知识&#xff0c;那么&#xff0c;最好的复习方式就是刷题啦&#xff0c;现在&#xff0c;我们就进入C语言的世界吧 从最简单的开始噢 完完全全零基础都能看懂 题目来源于牛客网 编程语言初学训…...

【刷题】搜索——BFS:城堡问题(The Castle)

目录题目代码&#xff08;Flood Fill&#xff09;代码&#xff08;并查集&#xff09;题目 题目链接 找出房间个数——>求连通块个数 最大房间——>求最大连通块 直接用flood fill算法 注意题目的输入&#xff0c;例如118211182111821&#xff0c;则代表有西、北、南墙…...

深度学习——torch相关函数用法解析

1. torch.ones() torch.ones(*sizes, outNone) → Tensor函数功能&#xff1a;返回一个全为1 的张量&#xff0c;形状由可变参数sizes定义。 参数: sizes (int…) – 整数序列&#xff0c;定义了输出形状 out (Tensor, optional) – 结果张量 例子&#xff1a; >>> …...

ubuntu 20使用kubeadm安装k8s 1.26

步骤 机器&#xff1a;4核8G&#xff0c;root账号&#xff0c;可访问互联网 1、更新apt apt-get update 2、安装一些基本工具 apt-get install ca-certificates curl gnupg lsb-release net-tools apt-transport-https 3、ifconfig 获取ip&#xff0c;hostname获取主机名&…...

低代码开发平台|制造管理-生产过程管理搭建指南

1、简介1.1、案例简介本文将介绍&#xff0c;如何搭建制造管理-生产过程。1.2、应用场景先填充工序信息&#xff0c;再设置工艺路线对应的工序&#xff1b;工序信息及工艺路线列表报表展示的是所有工序、工艺路线信息&#xff0c;可进行新增对应数据的操作。2、设置方法2.1、表…...

python对多个csv文件进行合并(表头需一致)

之前写过python对【多个Excel文件】中的【单个sheet】进行合并&#xff0c;参考&#xff1a;点我 之前也写过python对【多个Excel文件】中的【多个sheet】进行合并&#xff0c;参考&#xff1a;点我 今天再写一个python对多个csv格式的文件进行合并的小工具 但是大家切记&am…...

Salesforce Apex调用邮件模板

正常调用无模板&#xff1a;mail.setToAddresses(new List<String>{user.Email});//mail.setReplyTo(444298824qq.com);//mail.setCcAddresses(null);mail.setSenderDisplayName(EOP系统);mail.setSubject(EOP通知&#xff08;待审批&#xff09;&#xff1a;您有未处理的…...

windows本地开发Spark[不开虚拟机]

1. windows本地安装hadoop hadoop 官网下载 hadoop2.9.1版本 1.1 解压缩至C:\XX\XX\hadoop-2.9.1 1.2 下载动态链接库和工具库 1.3 将文件winutils.exe放在目录C:\XX\XX\hadoop-2.9.1\bin下 1.4 将文件hadoop.dll放在目录C:\XX\XX\hadoop-2.9.1\bin下 1.5 将文件hadoop.dl…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

GraphQL 实战篇:Apollo Client 配置与缓存

GraphQL 实战篇&#xff1a;Apollo Client 配置与缓存 上一篇&#xff1a;GraphQL 入门篇&#xff1a;基础查询语法 依旧和上一篇的笔记一样&#xff0c;主实操&#xff0c;没啥过多的细节讲解&#xff0c;代码具体在&#xff1a; https://github.com/GoldenaArcher/graphql…...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…...

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发&#xff0c;采用现代化的Web技术&#xff0c;为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## &#x1f4cb; 系统概述 ### &#x1f3af; 系统定…...

Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践

前言&#xff1a;本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中&#xff0c;跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南&#xff0c;你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案&#xff0c;并结合内网…...

多元隐函数 偏导公式

我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式&#xff0c;给定一个隐函数关系&#xff1a; F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 &#x1f9e0; 目标&#xff1a; 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z​、 …...