背包9讲系列1-01背包问题

一、前言

最近打算出一个背包问题的专栏,详细介绍一下常见的几种不同类型的背包问题及其解题思路和方法,欢迎各位留言探讨。

二、什么是背包问题?

背包问题是动态规划中的一个分支,其目标是在给定的一组物品中选择一些物品放入背包,使得在满足背包容量限制的情况下,所选物品的总价值最大化或总重量最小化。背包问题大致可以分为9类,本章讲解的是01背包问题。

三、01背包

3.1 问题描述

有n个物品和一个容量为capacity的背包,每种物品只有一件,他们的体积分别为weights[i](0<=i<n),价值分别为values[i](0<=i<n),求将哪些物品装入背包可使价值总和最大?

3.2 解体思路

3.2.1 确定状态变量(函数)

最大价值是物品数量i与背包容量j的函数,设dp[i][j]表示从前i件物品中进行选择,放入容量为j的背包所能获得的最大价值

3.2.2 确定状态转移方程(递推关系)

对于第i个物品(第1个物品为weights[0],第i个物品为weights[i-1])的选择情况如下:

  • 1.如果当前背包剩余容量j<weights[i-1],则无法将该物品装入背包,此时最大价值与从前i-1个物品选择,放入容量为j的背包所能获得的最大价值相同
    dp[i][j] = dp[i-1][j]
    
  • 2.如果当前背包剩余容量j>=weights[i-1],则能放入第i件物品,但是需要判断放入该物品与不放入时哪种情况所能取到的价值最大。
    如果第i件物品不放入背包
    dp[i][j] = dp[i-1][j]
    
    如果第i件物品放入背包,背包剩余容量为j-weights[i-1],要使总价值最大,相当于从前i-1个物品中进行选择,放入容量为j-weights[i]的背包的最大价值再加上第i件物品的价值values[i-1]
    dp[i][j] = dp[i-1][j-weights[i-1]] + values[i-1]
    

3.2.3 确定边界条件

  • 当背包容量为0时,无法放入任何物品到背包中,总价值为0,即dp[i][0]=0 (0<=i<=n)
  • 当不放入任何物品到背包中时,总价值也为0,即dp[0][j]=0(0<=j<=n)

3.2.4 代码示例

/*** 背包问题-背包9讲*/
public class KnapsackQuestion {/*** 01背包** @param weights  存储n件物品重量的数组,weights[i-1]表示第i件物品的重量(下标从0开始)* @param values   存储n件物品价值的数组,values[i-1]表示第i件物品的价值* @param capacity 背包的容量* @return 从n件物品中进行选择,放入容量为capacity的背包中所能取得的最大价值*/public int knapsack01(int[] weights, int[] values, int capacity) {// dp[i][j]表示从前i件物品中选择,放入容量为j的背包的最大价值int n = weights.length;int[][] dp = new int[n + 1][capacity + 1];for (int i = 1; i <= n; i++) {for (int j = 1; j <= capacity; j++) {if (j >= weights[i - 1]) {dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weights[i - 1]] + values[i - 1]);} else {dp[i][j] = dp[i - 1][j];}}}return dp[n][capacity];}

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

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

相关文章

flink消费kafka限制消费速率

flink版本1.14 别的版本类似 需要速率限制的情况 1.任务异常在停止的时间内大量数据挤压 2.新任务上线需要铺底数据,消费几天前的数据 在不增加内存和并行度的情况下,如果任务启动可能会造成oom,这时需要进行速率限制。 前提 漏桶算法(Leaky Bucket Algorithm): 原…

基于IDEA+SpringBoot+Mysql开发的在线考试系统

基于springboot的在线考试系统 项目介绍&#x1f481;&#x1f3fb; 项目背景&#xff1a; 随着互联网的普及和技术的发展&#xff0c;传统的考试方式已经无法满足人们的需求。为了提高考试的效率和准确性&#xff0c;我们决定开发一个在线考试系统。该系统将提供登录、试卷列表…

UniApp 中的 u-input 属性讲解

在 UniApp 中&#xff0c;u-input 是一个常用的组件&#xff0c;用于接收用户的输入。它具有多种属性&#xff0c;用于控制输入框的样式和行为。下面我将为您讲解一些常用的 u-input 属性。 基本属性 value&#xff1a;表示输入框的初始值&#xff0c;可以使用 v-model 进行双…

CMake add_subdirectory

文章目录 简介基本语法 举例目录结构根目录CMakeLists子目录CMakeLists 简介 add_subdirectory 是 CMake 命令之一&#xff0c;用于在当前 CMakeLists.txt 文件中引入另一个子目录的 CMake 构建。这样&#xff0c;你可以在一个项目中组织多个子项目或子模块的构建。 基本语法…

lua完整学习笔记

lua注释 &#xff0d;&#xff0d; 单行注释 &#xff0d;&#xff0d;[[ 多行注释 ]]-- lua数据结构 nil 无效值与Java的Null类似&#xff0c;但是在条件表示中是false boolean 布尔值&#xff0c;ture或者false number 双精度类型的浮点数 string 字…

【Android知识笔记】性能优化专题(四)

App 线程优化 线程调度原理 任意时刻,只有一个线程占用CPU,处于运行状态多线程并发:轮流获取CPU使用权JVM负责线程调度:按照特定机制分配CPU使用权线程调度模型 分时调度模型:轮流获取、均分CPU时间抢占式调度模型:优先级高的获取,JVM采用Android线程调度 nice值:Proc…

.NET6实现破解Modbus poll点表配置文件

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,我们面对的不仅仅是技术还有人心,人心不可测,海水不可量,唯有技术,才是深沉黑夜中的一座闪烁的灯塔 !序言 Modbus 协议是工控领域常见…

11. Mysql 子查询

Mysql 函数参考和扩展&#xff1a;Mysql 常用函数和基础查询、 Mysql 官网 Mysql 语法执行顺序如下&#xff0c;一定要清楚&#xff01;&#xff01;&#xff01;运算符相关&#xff0c;可前往 Mysql 基础语法和执行顺序扩展。 (8) select (9) distinct (11)<columns_name…

beanFactory和Factorybean有啥区别

BeanFactory和FactoryBean是Spring框架中的两个重要概念&#xff0c;它们有一些区别和不同的用途。 BeanFactory&#xff1a; BeanFactory是Spring框架的核心接口&#xff0c;它是一个工厂模式的实现。它负责创建、管理和获取应用程序中的各种对象&#xff08;也称为bean&#…

C语言线性表的实现(详解)

数据结构之线性表 ​ 线性表的基本概念&#xff1a;线性表是由0个或者多个数据元素的有限序列 ​ 特性是&#xff1a; ​ 1&#xff1a;数据元素之间都是有顺序的 ​ 2&#xff1a;数据元素的个数是有限的&#xff0c; ​ 3&#xff1a;数据元素的类型是相同的 ​ 性质是&…

mysql数据库基础知识,Mysql的索引和主键区别,数据库的事务的基本特性

文章目录 数据库基础知识Mysql的索引和主键的区别数据库的事务的基本特性 数据库基础知识 为什么要使用数据库 数据保存在内存 优点&#xff1a; 存取速度快 缺点&#xff1a; 数据不能永久保存 数据保存在文件 优点&#xff1a; 数据永久保存 缺点&#xff1a;1&#xf…

.net面试题5

1.请解释一下C#中的接口&#xff08;Interface&#xff09;。 接口是一种定义了一组方法、属性、事件或索引器的合同&#xff08;Contract&#xff09;&#xff0c;它只包含成员的声明而不包含实现。接口定义了一种行为规范&#xff0c;类可以实现一个或多个接口来满足其约定。…

Java中数据库查询方法MapListProcessor的应用

1.供应链系统的销售合同捉过了两个金额一样的&#xff0c;同一个项目 2.合同号也一样&#xff0c;oaid不一样&#xff0c;但是从OA前台只有一个 3.一个是建云的一个是泛微的 4.做下过滤&#xff0c;如果同一个合同编号&#xff0c;在泛微里面有的&#xff0c;建云的就不获取了 …

WPF面试题高级篇

WPF高级篇[8] 32. 解释SelectedItem、SelectedValue和SelectedValuePath之间的区别&#xff1f; 在WPF中&#xff0c;SelectedItem、SelectedValue和SelectedValuePath是用于处理选择控件&#xff08;如ComboBox、ListBox等&#xff09;中选定项的属性和路径。 比如当使用选…

一维数组传参的本质

一维数组传参的本质 数组我们之前学过了&#xff0c;之前也讲了&#xff0c;数组是可以传递给函数的&#xff0c;这个小节我们讨论一下数组传参的本质。 首先&#xff0c;我们从一个问题开始&#xff0c;我们之前都是在函数外部计算数组的元素个数&#xff0c;那我们可以把函…

threejs下监听mesh事件与监听3D对象的区别

先说结论 监听mesh时会导致同一mesh下同一个位置&#xff0c;如果重叠着多个3D对象&#xff0c;点击事件会被触发多次。而监听3D对象只有这个对象会触发这个事件一次。 技术架构 reactthreejsreact-three/dreireact-three/fiber 场景 有这样一段代码&#xff0c;一个网格对…

Git安装

简单粗暴&#xff0c;跟着步骤一步一步来 右键就会有了

Rust内存布局

题图忘了来自哪里.. 整型,浮点型,struct,vec!,enum 本文是对 Rust内存布局 的学习与记录 struct A { a: i64, b: u64,}struct B { a: i32, b: u64,}struct C { a: i64, b: u64, c: i32,}struct D { a: i32, b: u64, c: i32, d: u64,}fn main(…

优思学院|如何在企业中实施降本增效策略,实现财务突破

在当今竞争激烈的商业环境中&#xff0c;企业降低成本并提高效益变得至关重要。本文将深入探讨如何降本增效&#xff0c;以及实施这些策略的方法。 提到降本增效或提升生产效率&#xff0c;第一个被提出来检讨的一定是直接部门。但是如果无视于日渐臃肿的间接部门&#xff0c;…

[AWS 考证]CSDN官方课程目录

一、亚马逊云科技简介 二、在云中计算 三、全球基础设施和可靠性 四、联网 五、存储和数据库 六、安全性 七、监控和分析 八、定价和支持 九、迁移和创新 十、云之旅 关注订阅号 CSDN 官方中文视频&#xff08;免费&#xff09;&#xff1a;点击进入 一、亚马逊云科…