代码随想录算法训练营day44 || 52. 完全背包问题,518. 零钱兑换II,377. 组合总和 Ⅳ

视频讲解:

带你学透完全背包问题! 和 01背包有什么差别?遍历顺序上有什么讲究?_哔哩哔哩_bilibili

动态规划之完全背包,装满背包有多少种方法?组合与排列有讲究!| LeetCode:518.零钱兑换II_哔哩哔哩_bilibili

动态规划之完全背包,装满背包有几种方法?求排列数?| LeetCode:377.组合总和IV_哔哩哔哩_bilibili

52. 完全背包问题

思路:与所预料的一样,就是01背包问题的重量遍历顺序从头开始遍历即可求解,另外优化的地方在于重量可以从当前物品对应的重量开始进行遍历,因此按物品外重量内的遍历顺序来遍历的话,只有j>=weights[i]才会进行递推,所以不妨直接在for循环赋值上就体现出来。

代码随想录 ==>

01背包中二维dp数组的两个for遍历的先后循序是可以颠倒了,一维dp数组的两个for循环先后循序一定是先遍历物品,再遍历背包容量。

在完全背包中,对于一维dp数组来说,其实两个for循环嵌套顺序是无所谓的!

因为dp[j] 是根据下标j之前所对应的dp[j]计算出来的。 只要保证下标j之前的dp[j]都是经过计算的就可以了。

import java.util.*;// 时间复杂度O(n^2)
// 空间复杂度O(n)public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int N = scanner.nextInt();int V = scanner.nextInt();int[] weights = new int[N];int[] values = new int[N];for(int i=0; i<N; i++){weights[i] = scanner.nextInt();values[i] = scanner.nextInt();}// dp数组的值表示的是放入的最大的价值int[][] dp = new int[N][V+1];for(int j=1; j<=V; j++){if(j >= weights[0])dp[0][j] = dp[0][j-weights[0]]+values[0];}for(int i=1; i<N; i++){for(int j=1; j<=V; j++){if(j >= weights[i]){dp[i][j] = Math.max(dp[i-1][j], dp[i][j-weights[i]]+values[i]);}elsedp[i][j] = dp[i-1][j];}}System.out.println(dp[N-1][V]);return;}
}

 

518. 零钱兑换II

思路:(题目类型:放满完全背包问题),但是却是第一次遇到的存在不可放的情况的题目。由于统计的是可行的找零策略,是求组合的问题。而针对不可行数值,无需进行额外的操作,仍然保留dp[j]+=dp[j-nums[i]]的递推公式,不可找零的数值将存在传递性,可自行将当前位置的不可行传递到下一个位置。这个策略的存在为之后的 零钱兑换 提供关键的思路。

// 时间复杂度O(n^2)
// 空间复杂度O(n)class Solution {public int change(int amount, int[] coins) {// coins的所有零钱种类作为物品数量int N = coins.length;// dp数组表示零钱i可有几种可行的找零策略int[] dp = new int[amount+1];// 固定搭配dp[0] = 1;// 可重复放值且组合形式的遍历for(int i=0; i<N; i++){for(int j=coins[i]; j<=amount; j++){dp[j] += dp[j-coins[i]];}}return dp[amount];}
}

377. 组合总和 Ⅳ

思路:关键理解物品与重量循环顺序颠倒后,即将求组合变成了求排列。(题目类型:放满完全背包问题)

// 时间复杂度O(n^2)
// 空间复杂度O(n)class Solution {public int combinationSum4(int[] nums, int target) {// dp数组的含义是容量为j的背包可以由由nums数组的元素组成的方式有几种int[] dp = new int[target+1];// 递推公式, dp[j] += dp[j-nums[i]]// 初始化,仅仅是为了推导dp[0] = 1;// !! 求组合,外层for循环遍历物品;求排列,则外层for循环遍历重量,从而可以使得访问物品// 外层for循环是物品的时候,每次更新的是整个dp,意义在于判断各个重量可以加入几个当前的nums[i],更新的牵扯也是关联到j-nums[i]的位置,// 外层for循环是重量的时候,每次更新的是dp数组中的某个位置,是用所有的物品去去试探当前重量可以放入几种物品,5-2和5-3两个位置的内容会加到一个位置里面去,而上一种里面,5-2加上了dp[3],但此时所考虑的物品仅仅是i之前的,i之后的不考虑;所以3,5都是由1和2拼出来的;只有到了3之后,才会将1,2,3三个都考虑;// 但是外层for循环重量的时候,是在每个重量,都去考虑1,2,3,所以5是从4,1  3,2  2,3 1,4 这样的全面进行考虑的for(int j=1; j<=target; j++){for(int i=0; i<nums.length; i++)if(j >= nums[i])dp[j] += dp[j-nums[i]];}return dp[target];}
}

 

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

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

相关文章

C# 读取excel返回dataset

1、读取函数 /// <summary> /// 读取excel数据 /// </summary> public DataSet ReadExcelFiles(string filePath,List<string> lSheetName) { string strConn String.Format("ProviderMicrosoft.Ace.Ole…

Hive调优——合并小文件

目录 一、小文件产生的原因 二、小文件的危害 三、小文件的解决方案 3.1 小文件的预防 3.1.1 减少Map数量 3.1.2 减少Reduce的数量 3.2 已存在的小文件合并 3.2.1 方式一&#xff1a;insert overwrite (推荐) 3.2.2 方式二&#xff1a;concatenate 3.2.3 方式三&#xff…

寒假学习记录15:Node(网络)

net模块 &#xff08;TCP/IP协议&#xff09; 创建客户端 1.引入net const net require("net"); 2.创建客户端 const socket net.createConnection({host:"连接地址的路径",port:80&#xff08;端口号&#xff09;},()>{console.log("连…

支付交易——重试服务

摘要 为了能在最大限度满足顾客要求的前提下尽可能降低成本&#xff0c;老王在开店的过程中想了很多方法。这充分体现出老王作为一个商人的特质:不放过一个订单&#xff0c;不浪费一分钱。 老王就这样在自己的生意上兢兢业业多年&#xff0c;想着应该不会有什么纰漏。但现实很…

常见单例模式详解

单例模式是23种设计模式中应用最广的模式之一&#xff0c;其定义&#xff1a;确保某一个类只有一个实例&#xff0c;而且自行实实例化并向整个系统通过这个实例。其类图如下&#xff1a; 通俗来说&#xff0c;单例模式就是用于创建那些在软件系统中独一无二的对象。在一个软件系…

来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp

今天又来写一篇C的文章&#xff0c;这里要讲的是C语言中的几个内存函数&#xff0c;主要是讲解功能和用法&#xff0c;望能耐心观看哦。望官方也多多曝光。 目录 memcpy memmove memset memcmp memcpy memcpy 是 C 语言标准库中的一个函数&#xff0c;用于复制内存块的内容…

rtt设备io框架面向对象学习-dac设备

目录 1.dac设备基类2.dac设备基类的子类3.初始化/构造流程3.1设备驱动层3.2 设备驱动框架层3.3 设备io管理层 4.总结5.使用 1.dac设备基类 此层处于设备驱动框架层。也是抽象类。 在/ components / drivers / include / drivers 下的dac.h定义了如下dac设备基类 struct rt_da…

基于Transformer的机器学习模型的主动学习

主动学习和基于Transformer的机器学习模型的结合为有效地训练深度学习模型提供了强有力的工具。通过利用主动学习&#xff0c;数据科学家能够减少训练模型所需的标记数据的数量&#xff0c;同时仍然达到高精度。本文将探讨基于Transformer的机器学习模型如何在主动学习环境中使…

MySQL数据库⑩_视图+MySQL用户管理(增删查改)

目录 1. 视图的概念和规则限制 2. 视图的基本使用 2.1 创建视图 2.2 修改视图影响基表 2.3 修改基表影响视图 2.4 删除视图 3. MySQL用户管理 3.1 用户信息 3.2 创建用户 3.3 修改用户密码 3.4 删除用户 4. 用户权限 4.1 MySQL权限 4.2 给用户授权 4.3 回收权限…

MongoDB聚合: $redact

$redact阶段可以根据文档本身存储的信息&#xff0c;限制输出整个文档或文档中的内容。 语法 { $redact: <expression> }使用 参数可以是任何有效的表达式&#xff0c;只要能被解析为$$DESCEND、$$PRUNE或 $$KEEP系统变量即可。 $$DESCEND $redact返回当前文档级别的…

Windows Server 2019 DHCP服务器搭建

系列文章目录 目录 系列文章目录 文章目录 前言 一、DHCP服务器是什么&#xff1f; 二、配置服务器 1.实验环境搭建 1)实验服务器配置和客户端 2)实验环境 2.服务器配置 ​编辑 文章目录 Windows Server 2003 Web服务器搭建Windows Server 2003 FTP服务器搭建Windows S…

深度优先搜索、广度优先搜索

搜索 搜索就是采用直接遍历整个状态空间的方式寻找答案的一类算法。根据遍历状态空间&#xff08;图&#xff09;方式的不同&#xff0c;可分为&#xff1a; 深度优先搜索&#xff08;DFS&#xff09; 适合树形状态空间&#xff0c;因为递归本身就会产生树的结构&#xff0c;可…

Leetcode 236.二叉树的最近公共祖先

题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以是它自己的…

在微信视频号上发表视频

我们手机打开微信 然后 最下面选择 发现 然后点击 上面的视频号 进入后 点击 右上角头像图标 然后 进入个人管理界面 左下角选择 发表视频 然后 进入一个录制界面 我们左下角 点击这个 从相册选择 打开相册后 选择自己需要的视频 然后 点击右下角下一步 觉得内容没问题 就…

Lua编译与运行

lua会首先把代码编译成中间码然后执行&#xff0c;或许大家都有所困惑&#xff1a;它不是解释性语言吗&#xff1f;其实lua作为解释性语言的意义在于其能在运行过程中完成编译工作&#xff0c;正是dofile、loadfile、require这种函数的存在&#xff0c;lua才能顺理成章地称自己…

VUE基础知识(JAVA后端入门篇)

VUE基础知识&#xff08;JAVA后端入门篇&#xff09; Vue是一套前端框架&#xff0c;免除原生JavaScriptr中的DOM操作&#xff0c;简化书写基于MVVM(Model–View-ViewModel)思想&#xff0c;实现数据的双向绑定&#xff0c;将编程的关注点放在数据上Vue.js - 渐进式 JavaScrip…

【python量化交易】qteasy使用教程02 - 获取和管理金融数据

qteasy教程2 - 获取并管理金融数据 qteasy教程2 - 获取并管理金融数据开始前的准备工作获取基础数据以及价格数据下载交易日历和基础数据查看股票和指数的基础数据下载沪市股票数据从本地获取股价数据生成K线图 数据类型的查找定期下载数据到本地回顾总结 qteasy教程2 - 获取并…

基于BitVM的乐观 BTC bridge

1. 引言 前序博客&#xff1a; 区块链互操作协议Bitcoin Bridge&#xff1a;治愈还是诅咒&#xff1f;BitVM&#xff1a;Bitcoin的链下合约 基于BitVM的乐观 BTC bridge&#xff1a; Trust-minimized two-way peg 机制 BitVM BTC bridge背后的主要思想是&#xff1a; 为比…

51单片机编程基础(C语言):电子时钟(LED1602作为显示)

题目要求&#xff1a; 审题时这个题是用数码管来显示的&#xff0c;数码管显示时钟我完成了一个&#xff0c;只是要求跟他不一样&#xff0c;所以这次想用LCD1602来显示&#xff0c;所以我先用LCD1602完成&#xff0c;再用数码管完成&#xff08;其实也只要在我之前的项目基础…

如何学习机器学习和深度学习: 软件工程师指南

一、简介 人工智能这个主题激发了我的兴趣&#xff0c;我一直在这个领域中不断学习和尝试新事物。 众所周知&#xff0c;与自然语言处理、计算机视觉等相关的技术已经出现并发展成为每天被数百万用户使用的解决方案。 尽管人们使用“人工智能”这一术语&#xff0c;但我们离…