当前位置: 首页 > 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…...

TrollInstallerX终极指南:一键在iOS设备上安装TrollStore的完整教程

TrollInstallerX终极指南&#xff1a;一键在iOS设备上安装TrollStore的完整教程 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX 您是否一直在寻找一种简单可靠的方法&am…...

mPLUG在金融领域的应用:票据智能识别系统

mPLUG在金融领域的应用&#xff1a;票据智能识别系统 1. 项目背景与需求 金融行业每天都要处理海量的票据单据&#xff0c;从银行的支票、汇票&#xff0c;到保险公司的保单、理赔单&#xff0c;再到企业的发票、报销单。传统的人工处理方式不仅效率低下&#xff0c;还容易出…...

老旧电脑焕新:OpenClaw+GLM-4.7-Flash在4GB内存设备上的优化运行方案

老旧电脑焕新&#xff1a;OpenClawGLM-4.7-Flash在4GB内存设备上的优化运行方案 1. 为什么要在老旧电脑上部署AI助手&#xff1f; 去年整理书房时&#xff0c;我翻出一台2015年的MacBook Air&#xff0c;4GB内存的配置在当下连浏览器开几个标签页都卡顿。正当准备将它送进回收…...

ai辅助开发:基于快马平台为trea国际版添加汇率数据智能分析功能

最近在开发Trea国际版应用时&#xff0c;遇到了一个需求&#xff1a;如何让用户更直观地理解汇率波动趋势&#xff0c;并通过自然语言交互获得分析结果。这个功能看似复杂&#xff0c;但借助InsCode(快马)平台的AI辅助开发能力&#xff0c;整个过程变得异常简单。下面分享我的实…...

Python调用SM9遭遇“Unknown curve”?紧急修复手册:从OpenSSL 3.0.7到国密SM9曲线OID映射全对照

第一章&#xff1a;Python调用SM9遭遇“Unknown curve”问题的根源定位当使用 Python&#xff08;如通过 cryptography 或 gmssl 库&#xff09;实现国密 SM9 算法时&#xff0c;常见报错 ValueError: Unknown curve 并非源于椭圆曲线参数缺失&#xff0c;而是因底层密码学库未…...

Mind+连接百度AI实战:手把手教你做一个能听会说的垃圾分类小助手

Mind与百度AI融合实战&#xff1a;打造智能垃圾分类助手的完整指南 在创客教育和STEAM领域&#xff0c;将硬件编程与人工智能结合已成为培养学生综合能力的新趋势。Mind作为一款图形化编程工具&#xff0c;以其低门槛和丰富的扩展库深受教育者和爱好者青睐。而百度AI开放平台提…...

java毕业设计基于SpringBoot酒店预定系统

前言 Spring Boot酒店预定系统是一种功能丰富、易于维护和扩展的在线预订平台。它通过整合前后端技术&#xff0c;实现了酒店信息的在线展示、预订、支付以及管理等一系列功能&#xff0c;为用户和酒店提供了便捷、高效的预订服务。随着旅游业和酒店业的不断发展&#xff0c;该…...

Yarle终极指南:3分钟完成Evernote到Markdown的无损迁移

Yarle终极指南&#xff1a;3分钟完成Evernote到Markdown的无损迁移 【免费下载链接】yarle Yarle - The ultimate converter of Evernote notes to Markdown 项目地址: https://gitcode.com/gh_mirrors/ya/yarle 还在为Evernote笔记迁移而烦恼吗&#xff1f;Yarle是您最…...

OpenClaw语音交互方案:GLM-4.7-Flash对接ASR/TTS

OpenClaw语音交互方案&#xff1a;GLM-4.7-Flash对接ASR/TTS 1. 为什么需要语音交互的OpenClaw&#xff1f; 上周三凌晨两点&#xff0c;我正在赶一份项目报告时突然冒出一个想法&#xff1a;如果能用语音控制OpenClaw执行自动化任务&#xff0c;是不是能彻底解放双手&#x…...

从原理到实战:深入解析Google Diff-Match-Patch的跨语言文本差异算法

1. 认识Google Diff-Match-Patch&#xff1a;文本差异处理的瑞士军刀 第一次接触文本差异比对需求是在开发一个在线协作编辑器时。当时用户抱怨版本对比功能总是显示整段文本变化&#xff0c;而他们只想看到具体修改了哪些单词。试过几个方案后&#xff0c;Google的diff-match-…...