算法训练营Day36

#Java #动态规划

开源学习资料

Feeling and experiences:

动态规划:01背包理论基础:卡码网题目链接

小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等,它们各自占据不同的空间,并且具有不同的价值。 

小明的行李空间为 N,问小明应该如何抉择,才能携带最大价值的研究材料,每种研究材料只能选择一次,并且只有选与不选两种选择,不能进行切割。

经典背包问题:

01 背包

有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。

import java.util.*;public class Main{public static void main(String[] args){//现根据题目写出输入Scanner sc = new Scanner(System.in);int M = sc.nextInt();int N = sc.nextInt();int[] values = new int[M];int[] weights = new int[M];//给数组赋值for(int i = 0;i < M;i++){weights[i] = sc.nextInt();}for(int i =0;i < M;i++){values[i] = sc.nextInt();}//创建dp数组int [][]dp = new int[M][N+1];//初始化dp数组for(int i = weights[0];i <= N;i++){dp[0][i] = values[0];}//遍历 递推for(int i = 1;i < M;i++){for(int j =0;j<=N;j++){if(weights[i] > j){dp[i][j] = dp[i-1][j];}else{dp[i][j] = Math.max(dp[i-1][j],dp[i-1][j-weights[i]] + values[i]);}}}System.out.println(dp[M-1][N]);}
}

notice:卡码网代码需要写输入代码。

初始化dp数组:

 这个循环初始化了dp数组的第一行,设定了只考虑第一个物品(索引为0)时的情况。


 如果第一个物品的重量(假设为10)小于等于背包的当前容量(i),则这个背包能够装下这个物品,因此dp[0][i](考虑第一个物品且背包容量为i时的最大价值)被设置为该物品的价值values[0]。
对于不能装下第一个物品的情况(即i < weights[0]),dp[0][i]默认为0(Java中数组的初始值)。

递推公式:

  外循环遍历物品(从第二个开始,因为第一个已经在初始化时考虑过了)。
  内循环遍历所有可能的背包容量。
  如果当前物品的重量大于背包的当前容量(weights[i] > j),那么这个物品无法被加入,因此最大价值与前一个物品时相同(即dp[i][j] = dp[i-1][j])。
  如果可以加入这个物品,我们需要决定是加入这个物品还是不加入。我们比较不加入这个物品时的最大价值(dp[i-1][j])和加入这个物品后的总价值(dp[i-1][j-weights[i]] + values[i])。

 

分割等和子集:力扣题目链接

给你一个 只包含正整数 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

示例 1:

输入:nums = [1,5,11,5]
输出:true
解释:数组可以分割成 [1, 5, 5] 和 [11] 。

抽象成背包问题,确实没有想到~

1. 初始检查:
• 检查数组长度是否小于2,如果是,直接返回false,因为无法分割成两个子集。
• 计算数组的总和sum和最大元素maxNum。


2. 总和的奇偶性检查:
• 如果sum是奇数,不能分割成两个和相等的子集,返回false。


3. 目标值设置:
• 将目标值设置为sum / 2。如果能找到和为target的子集,另一个子集自然也是target。
4. 最大元素检查:


• 如果任何单个元素大于target,则无法分割,返回false。
5. 动态规划表dp初始化:
• 创建一个布尔类型的二维动态规划表dp。dp[i][j]表示考虑前i个数字时,是否存在一个子集的和为j。
• 初始化所有dp[i][0]为true,因为不选择任何数字时,子集和为0。
• 将dp[0][nums[0]]设置为true,表示考虑第一个数字时,能达到的和为nums[0]。


6. 动态规划计算:
• 对于每个元素num和每个目标和j,更新dp表。
• 如果j大于或等于当前数字num,则检查:
• 不包含当前数字(dp[i - 1][j])。
• 包含当前数字(dp[i - 1][j - num]),意味着我们从j中减去当前数字的值,查看剩余值是否可以由前i-1个数字组成。
• 更新dp[i][j]为这两种情况的逻辑或(|)结果。

class Solution {public boolean canPartition(int[] nums) {int n = nums.length;if (n < 2) {return false;}int sum = 0, maxNum = 0;for (int num : nums) {sum += num;maxNum = Math.max(maxNum, num);}if (sum % 2 != 0) {return false;}int target = sum / 2;if (maxNum > target) {return false;}boolean[][] dp = new boolean[n][target + 1];for (int i = 0; i < n; i++) {dp[i][0] = true;}dp[0][nums[0]] = true;for (int i = 1; i < n; i++) {int num = nums[i];for (int j = 1; j <= target; j++) {if (j >= num) {dp[i][j] = dp[i - 1][j] | dp[i - 1][j - num];} else {dp[i][j] = dp[i - 1][j];}}}return dp[n - 1][target];}
}

Fighting!


 

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

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

相关文章

信息收集之子域名收集

渗透测试常见手法和思维 信息收集 简述 信息收集对于渗透测试前期来说是非常重要的&#xff0c;因为只有我们掌握了目标网站或目标主机足够多的信息之后&#xff0c;我们才能更好地对其进行漏洞检测。正所谓&#xff0c;知己知彼百战百胜&#xff01; 信息收集的方式可以分…

linux下can调试工具canutils编译安装

命令安装只需要 sudo apt-get install canutils 一、下载源码 下载canutils和libsocketcan libsocketcan地址&#xff1a;https://public.pengutronix.de/software/libsocketcan/libsocketcan-0.0.11.tar.bz2 #0.0.11版本 canutils地址&#xff1a;https://public.pengutronix…

【计算机毕业设计】基于springboot的校园跑腿任务管理系统java+vue

校园跑腿管理系统又称“效率鸭”跑腿系统&#xff0c;是在学校进行现代化的信息管理和提供信息服务的基础&#xff0c;引导人们快速、准确地获取快递资源、预约洗浴并对外卖资源进行有效管理的保证。疫情当下&#xff0c;为了减少人员的聚集&#xff0c;因此&#xff0c;迫切需…

StampedLock详解

在现代的Java应用中&#xff0c;同步是一个核心问题&#xff0c;尤其是在高并发环境下。Java提供了多种同步机制&#xff0c;从基本的synchronized关键字到更高级的ReentrantLock。但在Java 8中&#xff0c;引入了一个新的同步原语——StampedLock&#xff0c;它旨在提供更高的…

C#使用Office原生库开发后的运行问题

目录 一、准备 二、测试Office2007 1、直接运行 2、安装VS2009 3、重新在“引用”库 4、安装“包” 5、报错修复 6、小结 三、测试office2010 1、在VS2019中打开原项目 2、添加“包” 3、重新添加引用 4、测试Word功能 5、测试卸掉那两个“包” 6、测试Excel功能…

索引策略-多列索引

一. 前言 当我们对多列索引的理解不够深刻的时候,往往会为每个列创建独立的索引或者按照错误的顺序创建多列索引。 二. 案例说明 问题一: 为每个列创建独立索引 CREATE TABLE t(c1 INT,c2 INT,c3 INT,KEY(c1),KEY(c2),KEY(c3) );这种索引策略,一般都是由于人们听到一些专家诸…

阳光保险选择OceanBase稳定运行超700天

阳光保险集团成立于 2005 年 7 月&#xff0c;旗下拥有财产保险、人寿保险、信用保证保险、资产管理等多家专业子公司&#xff0c;是全球市场化企业中成长最快的集团公司之一&#xff0c;目前位列中国保险行业前八。随着数字化升级趋势的不断加速&#xff0c;很多企业产生将软硬…

达摩研究院Paraformer-large模型已支持windows

简介 FunASR是一个基础语音识别工具包&#xff0c;提供多种功能&#xff0c;包括语音识别&#xff08;ASR&#xff09;、语音端点检测&#xff08;VAD&#xff09;、标点恢复、语言模型、说话人验证、说话人分离和多人对话语音识别等。FunASR提供了便捷的脚本和教程&#xff0…

二十三、关于vite项目中无法使用minio的解决方案

问题背景 项目需要上传大文件,既然是大文件,如果一次性进行读取发送、接收都是不可取的,很容易导致内存问题。所以对于大文件上传,就一定要实现切片上传、断点续传。如果自己实现相对比较麻烦,但好消息是我们的文件服务使用了开源的minio作为对象存储服务,并且minio也提…

OpenGL排坑指南—贴图纹理绑定和使用

一、前言 在OpenGL学习 的纹理这一章中讲述了纹理贴图的使用方式&#xff0c;主要步骤是先创建一个纹理的对象&#xff0c;和创建顶点VAO类似&#xff0c;然后就开始绑定这个纹理&#xff0c;最后在循环中使用&#xff0c;有时候可能还要用到激活纹理单元的函数。然而&#xff…

练习-sizeof()和strlen()

目录 前言解题技巧一、sizeof()练习题1.1 整型数组1.1.1 一维整型数组1.1.2 二维整型数组 1.2 字符数组1.3 字符指针 二、strlen()练习题2.1 字符数组初始化时不包含\02.2 字符数组初始化包含\02.3 字符指针指向字符串常量 总结 前言 最近有点疲倦&#xff0c;啊啊啊&#xff…

电容的基础知识

一、电容单位 电容亦称作“电容量”&#xff0c;是指在给定电位差下的电荷储藏量&#xff0c;记为C&#xff0c;国际单位是法拉&#xff08;F&#xff09;。在国际单位制里&#xff0c;电容的单位是法拉&#xff0c;简称法&#xff0c;符号是F&#xff0c;由于法拉这个单位太大…

vue3项目部署到服务器,刚打开没事,一刷新页面就404

vue3项目部署到服务器&#xff0c;刚打开没事&#xff0c;一刷新页面就404 vue3项目&#xff0c;在本地调试时各方面都没毛病&#xff0c;刷新也没毛病&#xff0c;但是&#xff0c;扔到服务器上&#xff0c;第一次打开是正常的&#xff0c;再刷新下就404了&#xff0c;不知道什…

视频号小店入口在哪?需要什么资质?实操详解!

我是电商珠珠 视频号小店于22年7月产生&#xff0c;距今才发展了一年时间。今年正是它风口期正盛的时候&#xff0c;有很多想要入驻的新手还不知道它在哪&#xff0c;都需要什么资质。 接下来我来给大家详细的讲一下。 视频号小店入口 1、手机端 打开vx搜索“视频号开店”…

第二十章 常见的设计模式

文章目录 一、设计模式二、单例模式三、工厂模式四、抽象工厂模式五、适配器模式六、观察者模式七、代理模式八、策略模式九、MVC模式十、组合模式 一、设计模式 什么是设计模式 设计模式是一种固定的解决问题的方式是一套经过代码设计经验总结优化之后的固定的方式是软件工程…

vue2使用富文本wangeditor

安装 npm i wangeditor --save引用 import E from wangeditor;使用 // 富文本初始化initEditor() {this.isEdit true;this.$nextTick(() > {this.editor new E(this.$refs.editorElem); //绑定节点this.editor.config.height 550; //默认高度为 300&#xff0c;设置高度…

GLES学习笔记---立方体贴图(一张图)

一、首先看一张效果图 立方体贴图 二、纹理坐标划分 如上图是一张2D纹理&#xff0c;我们需要将这个2D纹理贴到立方体上&#xff0c;立方体有6个面&#xff0c;所以上面的2D图分成了6个面&#xff0c;共有14个纹理坐标 三、立方体 上边的立方体一共8个顶点坐标&#xff0c;范围…

图像处理中常用的距离

说明 在图像处理中&#xff0c;常用的距离度量用于衡量两个向量或特征之间的差异或相似性。以下是一些常用的距离度量及其使用说明和应用场景&#xff1a; 欧氏距离&#xff08;Euclidean Distance&#xff09;&#xff1a;欧氏距离是最常用的距离度量&#xff0c;用于衡量两个…

Docker-Compose编排Nginx1.25.1+PHP7.4.33+Redis7.0.11环境

实践说明&#xff1a;基于RHEL7(CentOS7.9)部署docker环境(23.0.1、24.0.2)&#xff0c;编排也可应用于RHEL7-9(如AlmaLinux9.1)&#xff0c;但因为docker的特性&#xff0c;适用场景是不限于此的。 文档形成时期&#xff1a;2017-2023年 因系统或软件版本不同&#xff0c;构建…

地图多点自动缩放,居中,思路和手写

效果如下 多个标记点顺次标记连接起来zoom缩放到合适等级&#xff0c;刚好能放下那么多点视野刚好在正中间 zoom 实现思路 获取多点的最大经纬度点和最小经纬度点&#xff08;这两个点相距离最远&#xff09;计算2个这两点之间的距离地图是有比例尺的&#xff0c;根据比例尺…