动态规划背包问题总结

news2024/11/24 19:40:31

背包问题分类繁多,对刚学习动态规划的新手的来说难度不小,接下来就来仔细理一理背包问题

首先我们先不管背包问题有几种分类,反正讲了也不会有什么深刻的认识,只有你真正做题遇到了,你来能感受到他大概是怎么样的

回到最初的起点,我们需要搞明白的是:

什么是背包问题?

我们可以问问gpt,gpt给出这样的解释:

背包问题的描述是:给定一系列物品的重量和价值,以及一个背包的容量,如何选择物品,使得装入背包的物品总价值最大,且背包内物品总重量不能超过背包容量。

更具体来说:

  • 给定n个物品,每个物品i有一个重量w和一个价值v
  • 给定一个背包的容量S
  • 目标是选择某些物品,使得这些物品的总重量不超过S,且这些物品的总价值最大

解决这个问题需要考虑每个物品是否选择的所有可能组合,然后计算每个组合的总价值。由于组合数目太多,直接枚举是不可行的。背包问题适合使用动态规划的思想,从子问题向上构建问题的最优解。

简单说就是你有一个容量为size的背包,然后有一堆物品,每个物品的重量(体积)weight,和价值value不同(也有相同的情况),你需要用你的背包去解决一系列问题,例如怎样装背包内物品价值最高?装满背包有几种方法?...

这些问题可谓五花八门,为了搞懂背包问题,我会按照分类和题目对背包问题进行一次总结

问题分类

对背包问题有了初步了解之后,我们就可以大概认识一下背包问题有多少种类了

这里借用一下卡哥的图,主要是按照物品的数量进行分类的

01背包:一个物品只有一个,也就是说一个物品只能选取一次,这样就不用考虑重复选取的问题了,为什么叫01背包呢,因为物品只有两种状态:0(不放入),1(放入)

完全背包:

多重背包:

分组背包:

背包问题怎么写?

我们通过最简单的01背包问题来学习一下背包问题的算法

题目如下: 

我们之前已经学习过动规五部曲了(也可以简化为三步,确定dp数组,初始化dp数组,dp递推公式),但是在做的时候总感觉下不了手(我自己做的时候就有这种感觉,题目变难了难以下手)

这里拆分成三步去设计算法

第一步确定dp数组:

我们知道dp数组就是表示状态的,这里我们要求的状态就是:从0到i个物品中任意取放入容量为j的背包中的最大价值总和

我们往往使用行来表示即将要放入的物品,用列来表示背包的容量

那么我们就可以确定dp数组为dp[i][j],其中i为即将放入的物品,它有两种状态放或不放;j表示背包的容量

 

第二步初始化dp数组:

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

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

相关文章

扩散模型实战(十三):ControlNet结构以及训练过程

推荐阅读列表: 扩散模型实战(一):基本原理介绍 扩散模型实战(二):扩散模型的发展 扩散模型实战(三):扩散模型的应用 扩散模型实战(四&#xff…

Android : 获取、添加、手机联系人-ContentResolver简单应用

示例图: MainActivity.java package com.example.mygetdata;import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat;import android.Mani…

vue项目通过HBuilder打包成apk,实现apk自动更新下载

vue 项目通过 HBuilder 打包成 apk,实现 apk 自动更新下载 1、vue 项目通过 HBuilder 打包成 apk vue 项目在终端执行 npm run build 打包成 dist 文件,生成的 dist 文件在 项目根目录下 在 HBuilder 中 新建一个项目 默认选择 5APP 的默认模板项目…

【多属性对象“{a:1,b:2}”】与【单属性对象的数组“[{a:1},{b:2}]”】的相互转换

前端开发的某些场景(比如用echarts开发某些可视化图表)经常需要将【多属性对象,如“{a:1,b:2}”】与【单属性对象的数组,如“[{a:1},{b:2}]”】做相互转换,以下是不通过循环,简洁实现这种转换的方法&#x…

广州华锐互动:线上3D低碳环保主题展厅,沉浸式体验有助于培养环保意识

随着科技的飞速发展,环保已经成为了全球关注的焦点。为了让更多的人了解环保科技的重要性,许多城市都建立了线上3D低碳环保主题展厅。这些展馆通过虚拟现实技术,让人们身临其境地感受到环保科技的魅力,从而提高人们的环保意识。 线…

卡码网语言基础课 | 14. 链表的基础操作Ⅱ

题目: 构建一个单向链表,链表中包含一组整数数据,输出链表中的第 m 个元素(m 从 1 开始计数)。 要求: 1. 使用自定义的链表数据结构 2. 提供一个 linkedList 类来管理链表,包含构建链表、输出…

自动标注好用吗?基于SAM和Label Studio搭建半自动实例分割标注平台

文章目录 一、半自动标注二、缺点三、安装方法1、 python版本要求2、下载playground3、SAM安装4、SAM权重下载5、安装label-studio-ml6、启动SAM接口7、SAM启动日志8、安装并启动label-studio9、label-studio启动日志 四、半自动标注使用方法1、创建project并导入数据2、标签设…

多元系的复相平衡

多元系的复相平衡 多元系的吉布斯函数 G-{T,p,n}系统 吉布斯关系 多元系的热力学基本方程

使用Three.js创建导航立方体

什么是导航立方体? 导航立方体是一个交互式的3D控件,它允许用户通过点击和拖动立方体的各个面来改变3D视图的方向。这是一种非常直观的方式,让用户能够轻松地在3D空间中导航。 创建导航立方体 下面是一个基本的步骤,说明如何使用Three.js创建一个导航立方体: // 创建场景…

ICCV 2023 | 动态蛇形卷积(内含即插即用的代码及测试用例)

论文链接: https://arxiv.org/abs/2307.08388 代码链接: https://github.com/YaoleiQi/DSCNet 下面直接上代码,并且源码中也给了测试用例,是一个即插即用的模块 import os import torch import numpy as np from torch impor…

怎么做excel表格的二维码?文件快速做二维码的教程

Excel表格怎么做成二维码来扫码插看呢?Excel是工作中常用的一种文件格式,想要将表格内容分享给其他人查看,那么将表格生成二维码的方法会更加的方便快捷,其他人只需要扫描二维码就可以查看或者下载文件。表格excel二维码可以通过文…

Rust语言入门教程(六) - 字符串类型

在Rust中, 字符串类型其实是一个比较复杂的话题。在Rust的标准库中,至少都提供了6种字符串类型,我们平常使用的最多的是其中的两种。这两种类型互相之间也有所关联: str: 字符串切片String 字符串 其中, 字…

细说数据仓库上篇

在谈数仓之前,先来看下面几个问题: 数仓为什么要分层? 用空间换时间,通过大量的预处理来提升应用系统的用户体验(效率),因此数据仓库会存在大量冗余的数据;不分层的话,…

高效运维管理的7个要点

T管理和运维工作涵盖了各行业的各岗位中,如何提高工作效率,规避风险,更好的做好IT管理和运维工作,已经成为一个不断探索和研究的新兴课题。因此,应从两个层面加强和完善IT管理和运维工作,可以改善IT运维工作…

为什么要编写测试用例,自己知道不就行了吗

“为什么要编写测试用例,测试用例写给谁看”,这个问题看似简单,但却涵盖了一系列复杂的考虑因素,并不太好回答。 为了向各位学测试的同学们解释清楚“为什么编写测试用例是至关重要的”,我将通过以下5个方面进行展开&…

MySQL-05-MySQL的日志系统

1-redo log(重做日志) 在MySQL里也有这个问题,如果每一次的更新操作都需要写进磁盘,然后磁盘也要找到对应的那条记录,然后再更新,整个过程IO成本、查找成本都很高。MySQL里经常说到的WAL技术,WAL的全称是Write-Ahead L…

pmos防反保护电路的设计,pmos烧毁原因分析

概述 汽车电源系统常在极为恶劣的环境下运行,数以百计的负载挂在汽车电池上,需要同时确定负载状态的汽车电池可能面临极大的挑战。当负载处于不同工作条件和潜在故障状态时,设计人员需要考虑电源线产生的各种脉冲可能带来的影响。 本系列的上…

VSD Viewer for Mac(Visio绘图文件阅读器)

VSD Viewer for Mac版是mac上一款非常强大的Visio绘图文件阅读器,它为打开和打印Visio文件提供了简单的解决方案。可以显示隐藏的图层,查看对象的形状数据,预览超链接。还可以将Visio转换为包含图层,形状数据和超链接的PDF文档。 …

RHEL开发者授权注册

$ sudo subscription-manager register --usernameusername --passwordpassword$ sudo subscription-manager attach --auto查看是否注册 Red Hat 订阅管理,请运行以下命令: $ sudo subscription-manager list --installed

mysql账户密码获取

数据库安装目录 MySQL\data\mysql 里面的user.MYD文件,需要编译查看 数据库里的user表 库下面的user表拿到后,直接解密密码即可 网站配置文件 conn、config、data、sql、common 、inc这些文件 比如pikachu\inc目录下的config.inc.php文件的内容会显示…