DP进阶之路——01背包问题

题目链接:题目页面

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

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

输入描述

第一行包含两个正整数,第一个整数 M 代表研究材料的

种类,第二个正整数 N,代表小明的行李空间。

第二行包含 M 个正整数,代表每种研究材料的所占空间。 

第三行包含 M 个正整数,代表每种研究材料的价值。

输出描述

输出一个整数,代表小明能够携带的研究材料的最大价值。

输入示例

6 1
2 2 3 1 5 2
2 3 1 5 4 3

输出示例

5

提示信息

小明能够携带 6 种研究材料,但是行李空间只有 1,而占用空间为 1 的研究材料价值为 5,所以最终答案输出 5。 

数据范围:
1 <= N <= 1000
1 <= M <= 1000
研究材料占用空间和价值都小于等于 1000

其实针对背包问题,做了几个题目后发现,都可以直接套用模板了,但是我们还是需要明白它是怎么实现的,不能一知半解。

 

我们需要明白的其实有:

1、dp[i]指的是什么?

2、dp数组初始值应该是哪些,为什么?

3、递归公式是怎样的,为什么是这样的?

 4、weight数组是哪个,value数组是哪个?最大容量是多少?

 

具体思路:

这里简单画了一个图。

1、我们可以知道的是dp[i]是当为第i个物品的时候。

2、dp数组初始化要的是先把物品1的数组全部赋值

3、dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-weight[i]] + value[i])

就是当前j容量的时候,可以加入第i个物品时候的最大价值

这里是针对上面题目给出的代码:

import java.util.*;public class Main {public static void main(String[] args) {// 背包容量 N// 物品种类 MScanner 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();}int[][] dp = new int[M][N+1];// 初始化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]);}
}

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

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

相关文章

web自动化上传文件

1&#xff0c;web 自动化文件上传不要太简单 熟悉 web 自动化测试的大佬应该都懂&#xff0c;当采用 js 调用原生控件进行文件上传的时候&#xff0c;最常用的是使用 pywin32 等系统交互库。 当看到 pywin32 那丑陋的 api 封装只能爆粗口。就为了输入一个文件地址&#xff0c;…

Python多线程和线程池的下载实战用法

1.多线程和线程池用法区别 多线程和线程池都是Python中常用的并发编程方式&#xff0c;根据具体的需求和场景选择合适的方式。 多线程&#xff1a; 优点&#xff1a;直观、简单&#xff0c;适合简单的并发任务。可以使用 threading.Thread 类创建线程&#xff0c;每个线程独立…

频谱论文:基于空间稀疏采样的频谱态势生成: 模型与算法

#频谱# 张国勇,王军,陈霄南等.基于空间稀疏采样的频谱态势生成:模型与算法[J].中国科学:信息科学,2022,52(11):2011-2036. &#xff08;电子科技大学&#xff09; 摘要 面对日益复杂的电磁频谱环境和持续增长的用频需求, 为了维护电磁频谱秩序和安全, 提高频谱资源整体利用效率…

【Vue】Vue2的最后一舞

Vue 2.7 是 Vue 2.x 的最后一个次级版本。在此发布之后&#xff0c;Vue 2 将会进入长期技术支持 (LTS&#xff1a;long-term support) 状态&#xff0c;该状态从现在起计算会持续 18 个月&#xff0c;且不再提供新特性。 根据Vue官网的说法&#xff0c;随着Vue 2.7的发布&#…

《LeetCode力扣练习》代码随想录——栈与队列(逆波兰表达式求值---Java)

《LeetCode力扣练习》代码随想录——栈与队列&#xff08;逆波兰表达式求值—Java&#xff09; 刷题思路来源于 代码随想录 150. 逆波兰表达式求值 栈 class Solution {public int evalRPN(String[] tokens) {// Stack<Integer> stacknew Stack<>();Deque<Integ…

Vue - 事件处理详解

组件代码 下面是一个基本的 Vue.js 组件代码&#xff0c;其中包含了不同类型的事件处理器&#xff1a; <template><div><!-- 内联事件处理器&#xff1a;点击按钮时调用 increaseCount 方法 --><button click"increaseCount">加 1</but…

南大通用数据库 GBase 8a 性能调优方法--Hash索引

南大通用数据库--GBase 8a中建立Hash Index 通常可以用来解决等值查询的定位效率&#xff0c;特别是对以单表精确查询为主的应用场景尤为适合&#xff0c;如电信业务中的并发话单查询等&#xff08;特别是内存基本充足的场景&#xff09;。 默认创建GLOBAL的哈希索引。创建全局…

组合[中等]

一、题目 给定两个整数n和k&#xff0c;返回范围[1, n]中所有可能的k个数的组合。你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 示例 2&#xff1a; 输入&#xff1a;n 1…

《对话品牌》——魅力女人:成就幸福人生

本期节目《对话品牌》栏目组邀请到了北京紫琪尔健康管理集团董事长紫琪尔孙红宇女士参加栏目录制&#xff0c;分享其企业故事&#xff0c;树立品牌形象&#xff0c;提升品牌价值&#xff01; 节目嘉宾&#xff1a;紫琪尔集团董事长孙红宇 节目主持人&#xff1a;吴昊 节目播…

前端 -- 基础 常用标签 ( 图像标签及其属性详解)

目录 图像标签 &#xff1a; 插入图像 图像标签的其它属性 &#xff1a; alt 属性 title 属性 width 属性 height 属性 border 属性 注意 图像标签 &#xff1a; 在我们的网页中&#xff0c;可以看到 好多 好多 图片&#xff0c;那这些图片又是怎样 在…

Android画布Canvas drawPath绘制跟随手指移动的圆,Kotlin

Android画布Canvas drawPath绘制跟随手指移动的圆&#xff0c;Kotlin import android.content.Context import android.graphics.Canvas import android.graphics.Color import android.graphics.Paint import android.graphics.Path import android.os.Bundle import android.…

数据库中修改表的语句

1.修改表名&#xff1a;ALTER TABLE 旧表名 RENAME AS 新表名 例&#xff1a;ALTER TABLE teacher RENAME AS teacher1 2.增加表的字段&#xff1a;ALTER TABLE 表名 ADD 字段名 列属性 例&#xff1a;ALTER TABLE teacher1 ADD age INT(11) …

Java 类加载与字节码技术

3 类加载与字节码技术 3.1 类文件结构 类文件结构字节码指令编译期处理类加载阶段类加载器运行期优化 根据 JVM 规范&#xff0c;类文件结构如下 ClassFile {u4 magic;u2 minor_version; // 小版本号u2 major_version; // 主版本号u2 constant_pool_count; // 常量池cp_info…

算法时间空间复杂度计算—空间复杂度

算法时间空间复杂度计算—空间复杂度 空间复杂度定义影响空间复杂度的因素算法在运行过程中临时占用的存储空间讲解 计算方法例子1、空间算法的常数阶2、空间算法的线性阶&#xff08;递归算法&#xff09;3、二分查找分析方法一&#xff08;迭代法&#xff09;方法二&#xff…

WEB 3D技术 three.js 色彩空间讲解

上文 WEB 3D技术 three.js 设置环境贴图 高光贴图 场景设置 光照贴图 我们讲了基础材质的各种纹理 但是 我们的图片 到了界面场景中 好像绿的程度有点不太一样了 这里的话 涉及到我们的色彩空间 他有两种 一种是线性的 一种是 sRGB类型的 线性呢 就是根据光照强度 去均匀分…

【满分】【华为OD机试真题2023CD卷 JAVAJS】API集群负载统计

华为OD2023(C&D卷)机试题库全覆盖,刷题指南点这里 API集群负载统计 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 某个产品的RESTful API集合部署在服务器集群的多个节点上,近期对客户端访问日志进行了采集,需要统计各个API的访问频次,根据热点信息在服务…

拓扑排序图解-Kahn算法和深度优先搜索

拓扑排序 是将一个有向无环图中的每个节点按照依赖关系进行排序。比如图 G G G存在边 < u , v > <u,v> <u,v> 代表 v v v的依赖 u u u, 那么在拓扑排序中&#xff0c;节点 u u u一定在 v v v的前面。 从另一个角度看&#xff0c;拓扑排序是一种图遍历&#…

KMP算法的理解+板子

对kmp算法的理解中&#xff0c;很重要的一点就是next数组。 很多人不理解next数组的含义&#xff0c;是因为它同时具有两个意思&#xff0c;而且这两个意思在不同的环境下不同。 现在给你两个字符串&#xff1a; 一个是文本串 text 一个是模板串 pattern 然后定义两个指针…

《别让猴子跳回背上》——管理者的时间管理

讲时间管理的书很多&#xff0c;但这本是专门讲给管理者的时间管理。 在职场中&#xff0c;许多管理者都会碰到工作计划执行不下去、组织目标难于实现的问题&#xff0c;搭进了自己所有可以支配的时间&#xff0c;仍旧是焦头烂额&#xff0c;顾此失彼&#xff1b;而下属则因为…

力扣题目学习笔记(OC + Swift)19. 删除链表的倒数第 N 个结点

19. 删除链表的倒数第 N 个结点 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 此题目为链表题&#xff0c;拿出我们的杀手锏&#xff0c;链表解题经典三把斧&#xff1a; 哑巴节点栈快慢指针 关于内存问题&#xff1a;由于Swift及…