代码随想录算法训练营第四十一天 | 01背包理论基础、416. 分割等和子集

01背包理论基础

题目链接:https://kamacoder.com/problempage.php?pid=1046
文档讲解:01背包理论基础(一)、01背包理论基础(二)
视频讲解:01背包理论基础(一)、01背包理论基础(二)

背包问题的区别

  • 01背包:每种物品只有一个
  • 完全背包:每种物品有无限个
  • 多重背包:每种物品有不同的个数

思路

二维dp数组

  • 确定dp数组以及下标的含义:任取下标为0 - i的物品,放入容量为j的背包里,得到的最大价值为dp[i][j]
  • 确定递推公式:
    • 不放物品i,背包j的最大价值为dp[i - 1][j]
    • 放物品i,背包j的最大价值为dp[i - 1][j - weight[i]] + i
    • 取二者的最大值:dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i])
  • dp数组如何初始化:第一行是背包容量为0 - j,放入物品0后的价值,那么只要背包容量大于物品0的重量,就可以初始化为物品0的价值,否则为0;第一列因为背包没有容量,所以都初始化为0
  • 确定遍历顺序:对于二维数组实现01背包,先遍历背包或先遍历物品都是可以的。
  • 打印dp数组,用于debug。

一维dp数组

  • 确定dp数组以及下标的含义:容量为j的背包的最大价值为dp[j]
  • 确定递推公式:
    • 在二维数组中第i层的数据是由上一层得到的,所以使用滚动数组的概念,将二维压缩成一维。
    • 不放物品i,背包j的最大价值为dp[j]
    • 放物品i,背包j的最大价值为dp[j - weight[i]] + i
    • 取二者的最大值:dp[i][j] = Math.max(dp[j], dp[j - weight[i]] + value[i])
  • dp数组如何初始化:dp[0] = 0
  • 确定遍历顺序:先正序遍历物品,再倒序遍历背包。如果正序遍历,会将一个物品加进去多次。二维数组中数据是根据上一层得到的,两层的数据互相不影响。
  • 打印dp数组,用于debug。

代码

二维dp数组

import java.util.*;public class Main{public static void main(String[] args) {Scanner in = new Scanner(System.in);int m = in.nextInt(); // 物品int n = in.nextInt(); // 背包int[] weight = new int[m];int[] value = new int[m];int[][] dp = new int[m][n + 1];for (int i = 0; i < m; i++) weight[i] = in.nextInt();for (int i = 0; i < m; i++) value[i] = in.nextInt();// 初始化for (int i = weight[0]; i <= n; i++) dp[0][i] = value[0];// 遍历for (int i = 1; i < m; i++) {for (int j = 0; j <= n; j++) {if (weight[i] > j) dp[i][j] = dp[i - 1][j];else dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);}}System.out.println(dp[m - 1][n]);}
}

分析:时间复杂度:O(n2),空间复杂度:O(n2)。

一维dp数组

import java.util.*;public class Main{public static void main(String[] args) {Scanner in = new Scanner(System.in);int m = in.nextInt();int n = in.nextInt();int[] weights = new int[m];for (int i = 0; i < m; i++) weights[i] = in.nextInt();int[] values = new int[m];for (int i = 0; i < m; i++) values[i] = in.nextInt();int[] dp = new int[n + 1];for (int i = 0; i < m; i++) {for (int j = n; j >= weights[i]; j--) {dp[j] = Math.max(dp[j], dp[j - weights[i]] + values[i]);}}System.out.println(dp[n]);}
}

分析:时间复杂度:O(n2),空间复杂度:O(n)。

416. 分割等和子集

题目链接:https://leetcode.cn/problems/partition-equal-subset-sum/
文档讲解:https://programmercarl.com/0416.%E5%88%86%E5%89%B2%E7%AD%89%E5%92%8C%E5%AD%90%E9%9B%86.html
视频讲解:https://www.bilibili.com/video/BV1rt4y1N7jE/

思路

  • 确定dp数组以及下标的含义:容量为j的背包价值为dp[j]
  • 确定递推公式:nums数组里的数就相当于物品的重量和价值,需要用target的价值装满容量为target的背包,即dp[target] = target
  • dp数组如何初始化:dp[0] = 0
  • 确定遍历顺序:先正序遍历物品,再倒序遍历背包。
  • 打印dp数组,用于debug。

代码

class Solution {public boolean canPartition(int[] nums) {int sum = Arrays.stream(nums).sum();if (sum % 2 == 1) return false;int[] dp = new int[sum / 2 + 1];for (int i = 0; i < nums.length; i++) {for (int j = sum / 2; j >= nums[i]; j--) {dp[j] = Math.max(dp[j], dp[j - nums[i]] + nums[i]);if (dp[j] == sum / 2) return true;}}return false;}
}

分析:时间复杂度:O(n2),空间复杂度:O(n)。

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

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

相关文章

Javaweb07-JavaBean技术和Jsp开发模式

JavaBean技术和Jsp开发模式 一.JavaBean技术 1.JavaBean的基本概念 **JavaBean组件&#xff1a;**与html分离且使用Java代码封装类 **JavaBean分类&#xff1a;**可视化JavaBean&#xff1a;swing 非可视化JavaBean&#xff1a;用于封装实体和业务逻辑 JavaBean特点&#x…

把Vue文件转至树莓派上遇到的问题和解决方案

把整个文件夹复制进树莓派后&#xff0c;运行 npm run dev ,报错sh: 1: vite: Permission denied 解决方案&#xff1a;删除项目里的 node_modules 重新 npm install 再运行即可 rm -rf node_modules/ npm install 在安装过程中&#xff0c;遇到下图问题&#xff0c;vulnerabi…

【热门开源项目推荐】满足不同程序员的需求与关注点

目录 前言一、热门开源项目介绍二、使用开源热门项目的优势&#xff08;一&#xff09;经济方面&#xff08;二&#xff09;技术方面&#xff08;三&#xff09;社区支持及协作方面 三、程序员选择项目模型建议&#xff08;一&#xff09;关键步骤&#xff08;二&#xff09;示…

掌握rpc、grpc并探究内在本质

文章目录 rpc是什么&#xff1f;又如何实现服务通信&#xff1f;理解rpcRPC的通信过程通信协议的选择小结RPC VS Restful net_rpc实践案例net/rpc包介绍创建服务端创建client 看看net_rpc的通信调度实现的内部原理明确目标基于自己实现的角度分析我会怎么做代码分析 grpc介绍与…

使用微信小程序制作画布

在这个技术飞速发展的时代&#xff0c;微信小程序已经成为了人们生活中不可或缺的一部分。它们可以为用户提供各种各样的功能和娱乐&#xff0c;其中之一就是制作画布。在本文中&#xff0c;我们将介绍如何使用微信小程序创建一个简单的画布应用&#xff0c;并为你展示如何实现…

c++实现二叉搜索树(下)

好久不见啊&#xff0c;baby们&#xff0c;小吉我又回归了&#xff0c;发完这一篇小吉将会有两周时间不会更新blog了&#xff08;sorry&#xff09;&#xff0c;在小吉没有发blog的日子里大家也要好好学习数据结构与算法哦&#xff0c;还有就是别忘了小吉我❤️  这篇博客是二…

充电学习—7、BC1.2 PD协议

BC1.2&#xff08;battery charging&#xff09;充电端口识别机制&#xff1a; SDP、CDP、DCP 1、VBUS detect&#xff1a;vbus检测 PD&#xff08;portable device&#xff0c;便携式设备&#xff09;中有个检测VBUS是否有效的电路&#xff0c;电路有个参考值&#xff0c;高…

NumPy 双曲函数与集合操作详解

NumPy 双曲函数 NumPy 提供了 sinh()、cosh() 和 tanh() 等 ufunc&#xff0c;它们接受弧度值并生成相应的双曲正弦、双曲余弦和双曲正切值。 示例&#xff1a; import numpy as npx np.sinh(np.pi/2)print(x)示例 找到数组 arr 中所有值的双曲余弦值&#xff1a; import…

基于CNN的掩码自编码器微调用于分类任务

开源仓库 JJLi0427/CNN_Masked_Autoencoder: Design a patches masked autoencoder by CNN (github.com)https://github.com/JJLi0427/CNN_Masked_Autoencoder CNN自编码器 前面的文章中我们模仿MAE的思路用CNN做了一个掩码自编码器 动手小实验&#xff0c;用CNN来构建Mase…

python学习笔记-07

python内置函数 内置函数就是python自带的函数&#xff0c;不需要我们再去定义的&#xff0c;如print等直接使用即可&#xff0c;内置函数官方文档&#xff1a;官链。 1.数学运算 #数学运算&#xff1a; print(------abs()是绝对值函数------) a-1.1 print({}的绝对值是{}.fo…

MongoDB 正则表达式

MongoDB 正则表达式 MongoDB 是一个流行的 NoSQL 数据库&#xff0c;它提供了强大的查询功能&#xff0c;包括对正则表达式的支持。正则表达式是一种强大的文本搜索工具&#xff0c;它允许用户根据特定的模式匹配和搜索字符串。在 MongoDB 中&#xff0c;正则表达式可以用于查…

异常处理总结

自定义异常 ​ 系统中的异常可以分为我们能预知的异常和未知的系统异常&#xff0c;对于我们能预知的异常如空值判断&#xff0c;用户名错误&#xff0c;密码错误等异常我们需要返回客户端&#xff0c;对于系统内部异常如SQL语法错误&#xff0c;参数格式转换错误等需要统一包…

MySQL之复制(三)

复制 从另一个服务器开始复制 前面的设置都是嘉定主备库均为刚刚安装好且都是默认的数据&#xff0c;也就是说两台服务器上数据相同&#xff0c;并且知道当前主库的二进制日志。这不是典型的案例&#xff0c;大多数情况下有一个已经运行了一段时间的主库&#xff0c;然后用一…

QT day04

一、思维导图 二、登录界面优化 代码&#xff1a; 界面&#xff1a; *{background-color: rgb(255, 255, 255); }QFrame#frame{border-image: url(:/Logo/shanChuan.jpg);border-radius:15px; }#frame_2{background-color: rgba(110, 110, 110, 120);border-radius:15px; }Q…

redis-大key及影响

一、什么是大key Redis大Key其实并不是字面意思&#xff0c;不是指存储在Redis中的某个Key的大小超过一定的阈值&#xff0c;而是指该Key所对应的value过大。对于string类型来说&#xff0c;一般情况下超过10KB则认为是大Key&#xff0c;对于set&#xff0c;zset&#xff0c;h…

使用芯片为ZYNQ—7020,基于野火FPGA ZYNQ开发板

使用芯片为ZYNQ—7020&#xff0c;基于野火FPGA ZYNQ开发板 肤色模型简介 YCrCb也称为YUV&#xff0c;主要用于优化彩色视频信号的传输。与RGB视频信号传输相比&#xff0c;它最大的优点在于只需占用极少的频宽&#xff08;RGB要求三个独立的视频信号同时传输&#xff09;。其…

国内如何高速下载hugginging face模型

国内如何高速下载hugginging face模型 背景 如今开源大模型很多&#xff0c;相较于线上的调用接口&#xff0c;本地部署更有吸引力。这就免不了需要去Huggingface上下载模型&#xff0c;但因为国内管制要求&#xff0c;huggingface 并不能直接访问&#xff0c;或者下载速度很…

统计学一(术语,正态)

目录 一&#xff0c;常用术语 二&#xff0c;正态分布&#xff08;Normal Distribution&#xff09; 三&#xff0c;中心极限定理(Central Limit Theorem) 一&#xff0c;常用术语 population(族群)&#xff1a;要统计的总的 populationSize(族群数量)&#xff1a;要统计的总…

使用高斯混合模型(GMM)进行猫狗音频聚类(Kaggle Audio Cats and Dogs)

Audio Cats and Dogs | Kaggle 目录 一、实验目标 二、数据分析 三、实验结果 四、改进方向 一、实验目标 数据集包括164个标注为猫的.wav文件&#xff0c;总共1323秒和113个标注为狗叫声的.wav文件&#xff0c;总共598秒&#xff0c;要求判别每个音频是狗叫还是猫叫 二、…

反激开关电源保险丝以及热敏电阻的选型

保险丝&#xff08;2A/250V&#xff09; 保险丝的选型及计算 1、保险丝的作用就是在电路出现故障造成过流甚至短路时能及时切断电路电源的联系。&#xff08; 保护后 级电路&#xff0c;一旦出现故障&#xff0c;由于电流过大温度过高&#xff0c;保险丝熔断 &#xff09; 2、…