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

一文教你快速估计个股交易成本

交易本身对市场会产生影响&#xff0c;尤其是短时间内大量交易&#xff0c;会影响金融资产的价格。一个订单到来时的市场价格和订单的执行价格通常会有差异&#xff0c;这个差异通常被称为交易成本。在量化交易的策略回测部分&#xff0c;不考虑交易成本或者交易成本估计不合理…...

Leetcode—移除元素、删除有序数组中的重复项、合并两个有序数组

移除元素 此题简单&#xff0c;用双指针方法即可&#xff0c; 如果右指针指向的元素不等于val&#xff0c;它一定是输出数组的一个元素&#xff0c;我们就将右指针指向的元素复制到左指针位置&#xff0c;然后将左右指针同时右移&#xff1b; 如果右指针指向的元素等于 val&…...

面试(十)大疆 安全开发 C++1面

1. 在C++开发中定义一个变量,若不做初始化直接使用会怎样? 如果该变量是一个普通变量,则如果对其进行访问,会返回一个随机值,int类型不一定为0,bool类型也不一定为false 如果该变量为一个静态变量,则初始值都是一个0; 如果该变量是一个指针,那么在后续程序运行中很…...

短信链接跳转微信小程序

短信链接跳转微信小程序1 实现方案1.1 通过URL Scheme实现1.2 通过URL Link实现1.3 通过云开发静态网站实现2 实现方案对比3 实践 URL Schema 方案3.1 获取微信access_token3.2 获取openlink3.3 H5页面&#xff08;模拟短信跳转&#xff0c;验证ok&#xff09;4 问题小节4.1 io…...

吉林电视台启用乾元通多卡聚合系统广电视频传输解决方案

随着广播电视数字化、IP化、智能化的逐步深入&#xff0c;吉林电视台对技术改造、数字设备升级提出了更高要求&#xff0c;通过对系统性能、设计理念的综合评估&#xff0c;正式启用乾元通多卡聚合系统广电视频传输解决方案&#xff0c;将用于大型集会、大型演出、基层直播活动…...

Linux常用命令1

目录1、远程登陆服务器2、文件相关&#xff08;1&#xff09;文件和目录属性&#xff08;2&#xff09;创建目录mkdir&#xff08;3&#xff09;删除目录rmdir&#xff08;4&#xff09;创建文件touch&#xff08;5&#xff09;删除文件或目录rm&#xff08;6&#xff09;ls命令…...

【C++进阶】一、继承(总)

目录 一、继承的概念及定义 1.1 继承概念 1.2 继承定义 1.3 继承基类成员访问方式的变化 二、基类和派生类对象赋值转换 三、继承中的作用域 四、派生类的默认成员函数 五、继承与友元 六、继承与静态成员 七、菱形继承及菱形虚拟继承 7.1 继承的分类 7.2 菱形虚拟…...

AttributeError: module ‘lib‘ has no attribute ‘OpenSSL_add_all_algorithms

pip安装crackmapexec后,运行crackmapexec 遇到报错 AttributeError: module lib has no attribute OpenSSL_add_all_algorithms 直接安装 pip3 install crackmapexec 解决 通过 python3 -m pip install --upgrade openssl 或者 python3 -m pip install openssl>22.1.…...

Python实现视频自动打码功能,避免看到羞羞的画面

前言 嗨呀嗨呀&#xff0c;最近重温了一档综艺节目 至于叫什么 这里就不细说了 老是看着看着就会看到一堆马赛克&#xff0c;由于太好奇了就找了一下原因&#xff0c;结果是因为某艺人塌房了…虽然但是 看综艺的时候满影响美观的 咳咳&#xff0c;这里我可不是来教你们如何解…...

说说Knife4j

Knife4j是一款基于Swagger2的在线API文档框架使用Knife4j, 需要 添加Knife4j的依赖当前建议使用的Knife4j版本, 只适用于Spring Boot2.6以下版本, 不含Spring Boot2.6 在主配置文件(application.yml)中开启Knife4j的增强模式必须在主配置文件中进行配置, 不要配置在个性化配置文…...

如何网站做外贸生意/网站查询ip

概述为了增加用户体验&#xff0c;可能要求在一个APP中打开另外一个APP的需求&#xff0c;一般分为三种&#xff1a;显式调用跳转隐式调用跳转URL Scheme跳转代码用到的一些公共方法&#xff0c;当打开APP时&#xff0c;检测到第三方APP没安装时调到应用市场进行下载&#xff0…...

家政公司网站模板/百度竞价点击价格公式

Python使用pip命令安装时&#xff0c;默认使用的源是国外的网站&#xff0c;而国内访问比较慢&#xff0c;此时要换源&#xff0c;以下两种方法换源。 方法一(解决一次安装)&#xff1a; 阿里源 pip install 要安装的包名 -i http://mirrors.aliyun.com/pypi/simple/ --trust…...

网站建设邀请函/百度公司销售卖什么的

Leetcode算法Java全解答–32. 最长有效括号 文章目录Leetcode算法Java全解答--32. 最长有效括号题目想法结果总结代码我的答案大佬们的答案测试用例其他题目 给定一个只包含 ‘(’ 和 ‘)’ 的字符串&#xff0c;找出最长的包含有效括号的子串的长度。 示例 1:输入: "((…...

网站建设中 html 下载/英文网站建设

一、基础搭建 1.新建一个工程(New->Project) 2.点击Next 3.点击Next&#xff0c;选择Spring Web 4.点击Next&#xff0c;可指定工程的存放路径&#xff0c;或者默认即可。 5.点击Finish后&#xff0c;搭建完成。 搭建完成后的项目pom.xml中会自动引入web启动依赖&…...

网站建设seo 视频教程/天津百度推广网络科技公司

1.简介 xilinx提供了两个ip用于生成ROM存储空间。一个是 Distributed Memory Generator&#xff0c;另一个是Block Memory Generator&#xff0c;两者最主要的差别是生成的 Core所占用的 FPGA 资源不一样&#xff0c;从 Distributed Memory Generator 生成的 ROM/RAM Core 占用…...

旅游网站设计的目的/深圳市企业网站seo营销工具

日本某地发生了一件谋杀案&#xff0c;警察通过排查确定杀人凶手必为4个嫌疑犯 的一个。以下为4个嫌疑犯的供词。 A说&#xff1a;不是我。 B说&#xff1a;是C。 C说&#xff1a;是D。 D说&#xff1a;C在胡说 已知3个人说了真话&#xff0c;1个人说的是假话。 现在请根据这些…...