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

 完全背包

题目链接:完全背包

文档讲解:代码随想录/完全背包

视频讲解:视频讲解-完全背包

状态:已完成(1遍)

解题过程 

这几天属实是有点分身乏术了,先直接看题解AC了,二刷的时候再来补上自己的思路和尝试吧。

看完代码随想录之后的想法 

讲解代码如下:

// 先遍历物品,再遍历背包容量
function test_completePack1() {let weight = [1, 3, 5]let value = [15, 20, 30]let bagWeight = 4 let dp = new Array(bagWeight + 1).fill(0)for(let i = 0; i <= weight.length; i++) {for(let j = weight[i]; j <= bagWeight; j++) {dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i])}}console.log(dp)
}// 先遍历背包容量,再遍历物品
function test_completePack2() {let weight = [1, 3, 5]let value = [15, 20, 30]let bagWeight = 4 let dp = new Array(bagWeight + 1).fill(0)for(let j = 0; j <= bagWeight; j++) {for(let i = 0; i < weight.length; i++) {if (j >= weight[i]) {dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i])}}}console.log(2, dp);
}


 518. 零钱兑换 II

题目链接:518. 零钱兑换 II

文档讲解:代码随想录/零钱兑换 II

视频讲解:视频讲解-零钱兑换 II

状态:已完成(1遍)

解题过程  

 看完代码随想录之后的想法 

用动态规划五部曲:

  1. 确定dp数组以及下标的含义:凑成总金额j的货币组合数为dp[j]
  2. 确定递推公式:dp[j] += dp[j - coins[i]];
  3. 代码初始化如下:

    首先dp[0]一定要为1,dp[0] = 1是 递归公式的基础。如果dp[0] = 0 的话,后面所有推导出来的值都是0了。

    那么 dp[0] = 1 有没有含义,其实既可以说 凑成总金额0的货币组合数为1,也可以说 凑成总金额0的货币组合数为0,好像都没有毛病。

    但题目描述中,也没明确说 amount = 0 的情况,结果应该是多少。

    这里我认为题目描述还是要说明一下,因为后台测试数据是默认,amount = 0 的情况,组合数为1的。

    下标非0的dp[j]初始化为0,这样累计加dp[j - coins[i]]的时候才不会影响真正的dp[j]

    dp[0]=1还说明了一种情况:如果正好选了coins[i]后,也就是j-coins[i] == 0的情况表示这个硬币刚好能选,此时dp[0]为1表示只选coins[i]存在这样的一种选法。

  4. 确定遍历顺序:

    因为纯完全背包求得装满背包的最大价值是多少,和凑成总和的元素有没有顺序没关系,即:有顺序也行,没有顺序也行!

    而本题要求凑成总和的组合数,元素之间明确要求没有顺序。

    所以纯完全背包是能凑成总和就行,不用管怎么凑的。

    本题是求凑出来的方案个数,且每个方案个数是为组合数。

    那么本题,两个for循环的先后顺序可就有说法了。

    我们先来看 外层for循环遍历物品(钱币),内层for遍历背包(金钱总额)的情况。

    代码如下:

    for (int i = 0; i < coins.size(); i++) { // 遍历物品for (int j = coins[i]; j <= amount; j++) { // 遍历背包容量dp[j] += dp[j - coins[i]];}
    }
    

    假设:coins[0] = 1,coins[1] = 5。

    那么就是先把1加入计算,然后再把5加入计算,得到的方法数量只有{1, 5}这种情况。而不会出现{5, 1}的情况。

    所以这种遍历顺序中dp[j]里计算的是组合数!

    如果把两个for交换顺序,代码如下:

    for (int j = 0; j <= amount; j++) { // 遍历背包容量for (int i = 0; i < coins.size(); i++) { // 遍历物品if (j - coins[i] >= 0) dp[j] += dp[j - coins[i]];}
    }
    

    背包容量的每一个值,都是经过 1 和 5 的计算,包含了{1, 5} 和 {5, 1}两种情况。

    此时dp[j]里算出来的就是排列数!

讲解代码如下:

const change = (amount, coins) => {let dp = Array(amount + 1).fill(0);dp[0] = 1;for(let i =0; i < coins.length; i++) {for(let j = coins[i]; j <= amount; j++) {dp[j] += dp[j - coins[i]];}}return dp[amount];
}


377. 组合总和 Ⅳ 

题目链接:377. 组合总和 Ⅳ 

文档讲解:代码随想录/组合总和 Ⅳ 

视频讲解:视频讲解-组合总和 Ⅳ 

状态:已完成(1遍)

解题过程  

看完代码随想录之后的想法 

用动态规划五部曲:

  1. 确定dp数组以及下标的含义:凑成目标正整数为i的排列个数为dp[i]
  2. 确定递推公式:dp[i] += dp[i - nums[j]];
  3. dp数组如何初始化:

    因为递推公式dp[i] += dp[i - nums[j]]的缘故,dp[0]要初始化为1,这样递归其他dp[i]的时候才会有数值基础。

    至于dp[0] = 1 有没有意义呢?

    其实没有意义,所以我也不去强行解释它的意义了,因为题目中也说了:给定目标值是正整数! 所以dp[0] = 1是没有意义的,仅仅是为了推导递推公式。

    至于非0下标的dp[i]应该初始为多少呢?

    初始化为0,这样才不会影响dp[i]累加所有的dp[i - nums[j]]。

  4. 确定遍历顺序:target(背包)放在外循环,将nums(物品)放在内循环,内循环从前到后遍历
  5. 举例推导dp数组:

    按照这个递推公式我们来推导一下,dp数组应该是如下的数列: 10 15 30  。

讲解代码如下:

const combinationSum4 = (nums, target) => {let dp = Array(target + 1).fill(0);dp[0] = 1;for(let i = 0; i <= target; i++) {for(let j = 0; j < nums.length; j++) {if (i >= nums[j]) {dp[i] += dp[i - nums[j]];}}}return dp[target];
};

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

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

相关文章

服务器主板电池

一、什么是服务器纽扣电池&#xff1f; 服务器纽扣电池&#xff0c;也叫CMOS电池&#xff0c;是一种非常小型的电池&#xff0c;通常与服务器主板上的CMOS芯片相结合&#xff0c;用于储存BIOS设置、时钟和其他关键系统信息。这种电池的体积通常比一枚硬币还小&#xff0c;而且…

四、.Net8对接Ollama实现文字翻译(.Net8+SemanticKernel+Ollama)本地运行自己的大模型

.Net8SemanticKernelOllama 一、Semantic Kernel官方定义SK能做什么&#xff1f; 二、基本使用1、普通对话2、使用插件实现文本翻译功能 三、IChatCompletionService、ITextGenerationService、ITextEmbeddingGenerationService 很多情况都有这样的需求&#xff0c;使用自有系统…

巨细巨细的白痴级vulntarget-a靶场wp再不会你打死我

ad一&#xff0c;靶场搭建 下载靶场&#xff1a;GitHub - crow821/vulntarget: vulntarget靶场系列 官方拓补图 ps&#xff1a;此处 攻击机ip192.168.87.134&#xff0c;win7ip1为192.168.87.144 下载完毕后直接装入虚拟机不要进去&#xff0c;不要进去&#xff0c;不要进去…

lms如何连接测试前端:全面解析与操作指南

lms如何连接测试前端&#xff1a;全面解析与操作指南 在软件开发的世界里&#xff0c;连接学习管理系统&#xff08;LMS&#xff09;与测试前端是一个复杂但至关重要的任务。本文将从四个方面、五个方面、六个方面和七个方面&#xff0c;详细解析lms如何连接测试前端&#xff…

OpenHarmony应用在DevEco Studio配置默认密钥为123456的签名如何进行一键签名,运行起来

目录 一.背景知识 二.完成自动化操作 三.在DevEco Studio中配置自动化签名 一.背景知识 首先OpenHarmony的应用需要使用OpenH

一个完整的springboot项目,我们还需要做什么

文章目录 一 从0创建Srpingboot项目1.1 启动springboot项目1.2 导入必要的依赖 二、还缺什么2.1 统一异常捕获2.2 统一MVC返回2.3 数据分层2.4 连接数据库模块2.5 放置常量和工具类2.6 基础controller、基础entity、query查询类2.7 为了方便处理异常&#xff0c;一般还可以入参…

d3dcompiler43.dll丢失怎么修复,分享几种有效的修复教程

电脑已经成为我们生活中不可或缺的一部分。然而&#xff0c;由于各种原因&#xff0c;电脑可能会出现一些问题&#xff0c;其中之一就是d3dcompiler43.dll文件丢失。这个文件是DirectX组件之一&#xff0c;用于编译和链接DirectX应用程序。当这个文件丢失时&#xff0c;可能会导…

小白月赛91E Bingbong的字符串世界

知识点&#xff1a;系列自动机 刚开始想偏了&#xff0c;直接在字符串上操作&#xff0c;导致漏算了一些字符&#xff0c;ACCEPT前后都可以有字符串。 所以参考b站的讲解&#xff0c;要使用一个二维数组记录从i位开始第一次出现某字母的位置&#xff08;某字母指26个大写字母…

网安面试。

SQL注入 sql注入原理 对用户输入的数据没有进行严格的过滤与判断&#xff0c;导致用户构造各种恶意 payload 拼接进后台数据库查询语句中执行。 sql的类型 联合注入 堆叠注入 宽字节注入 cookie注入 XFF头注入 UA注入&#xff08;user-agent注入&#xff09; Referer注…

AI大模型探索之路-实战篇12: 构建互动式Agent智能数据分析平台:实现多轮对话控制

系列篇章&#x1f4a5; AI大模型探索之路-实战篇4&#xff1a;深入DB-GPT数据应用开发框架调研 AI大模型探索之路-实战篇5&#xff1a;探索Open Interpreter开放代码解释器调研 AI大模型探索之路-实战篇6&#xff1a;掌握Function Calling的详细流程 AI大模型探索之路-实战篇7…

nnUNet保姆级使用教程!从环境配置到训练与推理(新手必看)

文章目录 写在前面nnUNet是什么&#xff1f;一、配置虚拟环境二、安装nnUNet框架1.安装nnUNet这一步我遇到的两个问题&#xff1a; 2.安装隐藏层hiddenlayer&#xff08;可选&#xff09; 三、数据集准备nnUNet对于你要训练的数据是有严格要求的&#xff0c;这第一点就体现在我…

004 CentOS 7.9 mongodb7.0.11安装及配置

https://www.mongodb.com/try/download/shell https://www.mongodb.com/try/download/community 文章目录 /etc/mongod.conf在 /etc/systemd/system/ 目录下创建一个名为 mongod.service 的文件重新加载 systemd 配置&#xff1a;启用服务&#xff1a;现在&#xff0c;可以手动…

WEB攻防-JAVAWEB项目常见漏洞

知识点 1.JavaWeb常见安全及代码逻辑 2.目录遍历&身份验证&逻辑&JWT 3.访问控制&安全组件&越权&三方组件 本篇主要了解以上问题在javaweb中的呈现&#xff0c; 第一个重点理解URL与javaweb代码框架的对应方式&#xff0c;java在没有代码的情况下是很难…

151.反转字符串中的单词

给你一个字符串 s &#xff0c;请你反转字符串中单词的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的单词分隔开。 返回单词顺序颠倒且单词之间用单个空格连接的结果字符串。 注意&#xff1a;输入字符串 s中可能会存在前导空格、尾随空格或者单词…

PMP学习和考试难度分析

PMP&#xff08;项目管理专业人士&#xff09;考试目前是全球范围内比较具权威性和认可度的项目管理证书之一。因此PMP考试的难度是一个备受关注的话题。根据我们以往的学员经验我从不同角度解析PMP考试的难度&#xff0c;并提供一些应对挑战的建议。希望对大家有所帮助。 PMP考…

关于二进制中1的个数的研究

先看以下代码&#xff1a; #include<bits/stdc.h> #define ll long long #define un unsigned using namespace std; ll a[500005]; ll x[500005]; void init(){for(int i1;i<500000;i){x[i]__builtin_popcount(i); } } int main(){init();for(int i1;i<500000;i)…

Ubuntu 安装好虚拟环境后,找不到workon 命令

1、安装虚拟环境 pip3 install virtualenv pip3 install virtualenvwrapper 2、安装完成后 workon 命令。 找不到workon 命令 执行&#xff0c;source virtualenvwrapper.sh 执行后&#xff0c;在使用workon命令&#xff0c;即可完成。

JS【详解】时间复杂度

时间复杂度是从时间维度描述一段代码的复杂程度&#xff0c;由一段代码中执行频次最高的语句决定&#xff0c;用大O符号表述。 时间复杂度的分类 从低到高依次是&#xff1a; 常数时间复杂度 O(1)&#xff1a;无论问题规模如何变化&#xff0c;算法的运行时间都保持不变。 线性…

君耐策划有限公司员工信息管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;基础数据管理&#xff0c;公告管理&#xff0c;薪资管理&#xff0c;员工考勤管理 员工账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;公告管理&#xff0…

vivo鄢楠:基于OceanBase 的降本增效实践

在3 月 20 日的2024 OceanBase 数据库城市行中&#xff0c;vivo的 体系与流程 IT 部 DBA 组总监鄢楠就“vivo 基于 OceanBase 的降本增效实践”进行了主题演讲。本文为该演讲的精彩回顾。 vivo 在1995年于中国东莞成立&#xff0c;作为一家全球领先的移动互联网智能终端公司&am…