动态规划算法--01背包问题详细讲解步骤
举个例子
要确定哪些物品被放入背包以达到最大价值,可以在计算 dp 数组的同时记录选择的物品。具体来说,可以使用一个额外的数组来记录每个状态的选择情况。以下是一个详细的步骤和代码实现:
n = 3
W = 5
weights = [2, 1, 3]
values = [6, 3, 5]
初始化 dp 和 choice 数组
dp = [[0] * (W + 1) for _ in range(n + 1)]
choice = [[0] * (W + 1) for _ in range(n + 1)]print("初始状态:")
print("dp:")
for row in dp:print(row)
print("choice:")
for row in choice:print(row)
初始状态:
第1个物品(重量2,价值6)
# 第1个物品
for j in range(1, W + 1):if j >= weights[0]:if dp[0][j] < dp[0][j - weights[0]] + values[0]:dp[1][j] = dp[0][j - weights[0]] + values[0]choice[1][j] = 1else:dp[1][j] = dp[0][j]else:dp[1][j] = dp[0][j]print("处理第1个物品后:")
print("dp:")
for row in dp:print(row)
print("choice:")
for row in choice:print(row)
第2个物品(重量1,价值3)
# 第2个物品
for j in range(1, W + 1):if j >= weights[1]:if dp[1][j] < dp[1][j - weights[1]] + values[1]:dp[2][j] = dp[1][j - weights[1]] + values[1]choice[2][j] = 1else:dp[2][j] = dp[1][j]else:dp[2][j] = dp[1][j]print("处理第2个物品后:")
print("dp:")
for row in dp:print(row)
print("choice:")
for row in choice:print(row)
第3个物品(重量3,价值5)
for j in range(1, W + 1):if j >= weights[2]:if dp[2][j] < dp[2][j - weights[2]] + values[2]:dp[3][j] = dp[2][j - weights[2]] + values[2]choice[3][j] = 1else:dp[3][j] = dp[2][j]else:dp[3][j] = dp[2][j]print("处理第3个物品后:")
print("dp:")
for row in dp:print(row)
print("choice:")
for row in choice:print(row)
回溯路径
# 回溯路径,确定选择的物品
selected_items = []
j = W
for i in range(n, 0, -1):if choice[i][j] == 1:selected_items.append(i - 1) # 物品编号从0开始j -= weights[i-1]# 返回最大价值和选择的物品
max_value = dp[n][W]
selected_items = selected_items[::-1]print(f"最大价值: {max_value}")
print(f"选择的物品: {selected_items}")
最终,选择的物品是第2个(编号1)和第3个(编号2)物品,最大价值为11。
完整代码
def knapsack_with_items(n, W, weights, values):# 初始化 dp 和 choice 数组dp = [[0] * (W + 1) for _ in range(n + 1)]choice = [[0] * (W + 1) for _ in range(n + 1)]# 填充 dp 和 choice 数组for i in range(1, n + 1):for j in range(1, W + 1):if j >= weights[i-1]:if dp[i-1][j] < dp[i-1][j-weights[i-1]] + values[i-1]:dp[i][j] = dp[i-1][j-weights[i-1]] + values[i-1]choice[i][j] = 1else:dp[i][j] = dp[i-1][j]else:dp[i][j] = dp[i-1][j]# 回溯路径,确定选择的物品selected_items = []j = Wfor i in range(n, 0, -1):if choice[i][j] == 1:selected_items.append(i - 1) # 物品编号从0开始j -= weights[i-1]# 返回最大价值和选择的物品return dp[n][W], selected_items[::-1]# 示例
n = 3
W = 5
weights = [2, 1, 3]
values = [6, 3, 5]
max_value, selected_items = knapsack_with_items(n, W, weights, values)
print(f"最大价值: {max_value}")
print(f"选择的物品: {selected_items}")
一维数组的栗子
使用一维数组可以优化空间复杂度,将空间复杂度从O(nW) 降低到 O(W)。我们可以通过滚动数组的方式来实现这一点。
注意:从后往前遍历背包容量
如果背包容量j从前往后会出现什么问题呢?
n = 3
W = 5
weights = [2, 1, 3]
values = [6, 3, 5]# 初始化 dp 数组
dp = [0] * (W + 1)print("初始状态:")
print("dp:", dp)# 第1个物品
for j in range(weights[0], W + 1):if dp[j] < dp[j - weights[0]] + values[0]:dp[j] = dp[j - weights[0]] + values[0]print("处理第1个物品后:")
print("dp:", dp)
从前往后遍历背包容量 j 会导致同一个物品被多次选择,从而违反了01背包问题的约束。例如,在处理第1个物品时,当 j=4 时,dp[4] 被更新为 dp[2] + 6,而 dp[2] 已经被更新过,导致物品1被重复使用。
初始化
第1个物品(重量2,价值6)
for j in range(W, weights[0] - 1, -1):if dp[j] < dp[j - weights[0]] + values[0]:dp[j] = dp[j - weights[0]] + values[0]choice[1][j] = 1print("处理第1个物品后:")
print("dp:", dp)
print("choice:")
for row in choice:print(row)
第2个物品(重量1,价值3)
第3个物品(重量3,价值5)
回溯路径
完整代码
def knapsack_with_items_one_dim(n, W, weights, values):# 初始化 dp 数组dp = [0] * (W + 1)# 初始化 choice 数组,用于记录选择的物品choice = [[0] * (W + 1) for _ in range(n + 1)]# 填充 dp 和 choice 数组for i in range(1, n + 1):for j in range(W, weights[i-1] - 1, -1):if dp[j] < dp[j - weights[i-1]] + values[i-1]:dp[j] = dp[j - weights[i-1]] + values[i-1]choice[i][j] = 1# 回溯路径,确定选择的物品selected_items = []j = Wfor i in range(n, 0, -1):if choice[i][j] == 1:selected_items.append(i - 1) # 物品编号从0开始j -= weights[i-1]# 返回最大价值和选择的物品return dp[W], selected_items[::-1]# 示例
n = 3
W = 5
weights = [2, 1, 3]
values = [6, 3, 5]
max_value, selected_items = knapsack_with_items_one_dim(n, W, weights, values)
print(f"最大价值: {max_value}")
print(f"选择的物品: {selected_items}")
相关文章:
动态规划算法--01背包问题详细讲解步骤
举个例子 要确定哪些物品被放入背包以达到最大价值,可以在计算 dp 数组的同时记录选择的物品。具体来说,可以使用一个额外的数组来记录每个状态的选择情况。以下是一个详细的步骤和代码实现: n 3 W 5 weights [2, 1, 3] values [6, 3…...
操作系统(系统调用)
一. DPL目标描述符特权级,CPL当前描述符特权级 DPL和CPL用于区分内核态和用户态。内核态的DPL为0,用户态的DPL为3。注意每个段寄存器都有DPL的数据段。当从用户态切换到内核态时需要把段寄存器的DPL也设置为0。 CPL从当前段CS寄存器的低三位读出&#x…...
“iOS profile文件与私钥证书文件不匹配”总结打ipa包出现的问题
目录 文件和证书未加载或特殊字符问题 证书过期或Profile文件错误 确认开发者证书和私钥是否匹配 创建证书选择错误问题 申请苹果 AppId时勾选服务不全问题 总结 在上线ios平台的时候,在Hbuilder中打包遇见了问题,生成ipa文件时候,一…...
C4D细分曲面工具
细分为1,原理是连接两条临边的中点 细分为2 当对正方形进行循环切割时, 会改变临边 下图:没显示细分曲面 显示细分曲面...
FreeSWITCH 简单图形化界面34 - 网络环境安全的情况下,进行任意SIP注册
FreeSWITCH 简单图形化界面34 -网络环境安全的情况下,进行任意SIP注册 测试环境1、前言2、参数3、实践一下 测试环境 http://myfs.f3322.net:8020/ 用户名:admin,密码:admin FreeSWITCH界面安装参考:https://blog.cs…...
qt 发布简单项目
在 Qt 中将您的应用程序从调试模式发布为释放(Release)模式主要涉及到几个步骤。以下是一个简化的流程,适用于使用 Qt Creator 的用户: 1. 切换到 Release 模式 打开 Qt Creator。在左侧的项目视图中,选择您的项目。…...
SpringBoot启动流程
SpringApplication.run(XxxApplication.class, args); 加载各种配置信息,初始化容器并返回 1. 创建SpringApplication对象 (1)确认web应用类型,一般情况下是Servlet类型,将来会自动启动一个tomcat (2&am…...
Metasploit模块具体有哪些?
Metasploit框架是一个用于渗透测试和安全研究的强大工具,它提供了大量的模块,用于自动化漏洞利用、攻击和后期渗透等各类任务。Metasploit模块可以分为几种不同的类型,具体包括: 1. Exploit模块(漏洞利用)…...
【数据结构 | C++】部落
在一个社区里,每个人都有自己的小圈子,还可能同时属于很多不同的朋友圈。我们认为朋友的朋友都算在一个部落里,于是要请你统计一下,在一个给定社区中,到底有多少个互不相交的部落?并且检查任意两个人是否属…...
Kafka 数据倾斜:原因、影响与解决方案
Kafka:分布式消息系统的核心原理与安装部署-CSDN博客 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例-CSDN博客 Kafka 生产者全面解析:从基础原理到高级实践-CSDN博客 Kafka 生产者优化与数据处理经验-CSDN博客 Kafka 工作流程解析:…...
python特殊字符序列
字符 描述 \A 只匹配字符串的开始 \b 匹配一个单词边界 \B 匹配一个单词的非边界 \d 匹配任意十进制数字字符,等价于r[0-9] \D 匹配任意非十进制数字字符,等价于r[^0-9]’ \s 匹配任意空格字符(空格符、tab制表符、换…...
银河麒麟v10 二进制kubeadm+containerd搭建k8s集群(证书100年)—— 筑梦之路
环境说明 银河麒麟v10 x86架构,cgroup v2启用 系统内核:5.4.x 源码编译安装 kubeadm 1.31.2 自编译二进制文件,证书有效期100年 containerd 版本:2.0.0 IPHostnameOS VersionKernel VersionComment192.168.10.100k8s-master…...
uniapp 选择 省市区 省市 以及 回显
从gitee仓库可以拿到demo 以及 json省市区 文件 // 这是组件部分 <template><uni-popup ref"popup" type"bottom"><view class"popup"><view class"picker-btn"><view class"left" click"…...
HashMap底层原理
jdk1.8之后hashmap底层结构 jdk1.8之后,是哈希表数据结构,也可以说是数组链表或红黑树,下图是没有添加数据的一个hashmap。 现在开始添加数据,看下面具体步骤 put操作 如下,我们来简单看看hashmap的put源码ÿ…...
【8210A-TX2】Ubuntu18.04 + ROS_ Melodic + TM-16多线激光 雷达评测
简介:介绍 TM-16多线激光雷达 在8210A载板,TX2核心模块环境(Ubuntu18.04)下测试ROS驱动,打开使用RVIZ 查看点云数据,本文的前提条件是你的TX2里已经安装了ROS版本:Melodic。 大家好,…...
C语言--分支循环编程题目
第一道题目: #include <stdio.h>int main() {//分析://1.连续读取int a 0;int b 0;int c 0;while (scanf("%d %d %d\n", &a, &b, &c) ! EOF){//2.对三角形的判断//a b c 等边三角形 其中两个相等 等腰三角形 其余情…...
Flutter:AnimatedIcon图标动画,自定义Icon通过延时Interval,实现交错式动画
配置vsync,需要实现一下with SingleTickerProviderStateMixinclass _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin{// late延迟初始化 AnimationControllerlate AnimationController _controller;overridevoid initStat…...
单向链接表
# 封装普通节点的类 class Node:# 构造函数 定义节点的属性def __init__(self, data):self.data data #普通节点的数据域self.next None #普通节点的链接域 刚构造的节点该位置域为空# 封装链表的类(封装头节点) class LinkList:#构造函数def __init…...
用自由贸易去推动西安低空经济创新发展
——金庆培在中国(西安)国际低空经济发展大会上的发言 首先,我非常感谢大会组织委员会能邀请我参加今天的盛会。我代表中国自由贸易区创新发展研究联盟向大会的召开表示最热烈的祝贺在此,并预祝大会圆满成功! 我的发言…...
三开关VUE组件
一、使用效果 <template><QqThreeSwitch v-model"value" /><!-- <SqThreeSwitch v-model"value" :options"[test1, test2, test3]"><template #left-action><div style"display: flex"><IconMoon…...
介绍一下stricmp(c基础)
hi , I am 36 适合对象c语言初学者 stricmp(arr1,arr2);是不区分大小写的比较 格式 #include <string.h> strcmp (arr1,arr2); 工作原理:strcmp函数按照ACII(字符编码顺序)比较两个字符串。它从两个字符串的第一个字符开始逐个比…...
恋爱通信史之身份验证和不可抵赖性
在前文保密性中讲到:私钥就是一种身份的象征。那么,使用公钥能解密采用私钥加密的数据,就是表明该条信息就是私钥持有者发送的。那接下来就阐述一下,采用私钥加密公钥解密方式的数字签名和数字证书。 数字签名——不可抵赖性 抵…...
docker搭建私有的仓库
docker搭建私有仓库 一、为什么要搭建私有的仓库? 因为在国内,访问:https://hub.docker.com/ 会出现无法访问页面。。。。(已经使用了魔法) 当然现在也有一些国内的镜像管理网站,比如网易云镜像服务、Dao…...
苹果系统中利用活动监视器来终止进程
前言 苹果系统使用的时候总是感觉不太顺手。特别是转圈的彩虹球出现的时候,就非常令人恼火。如何找到一个像Windows那样任务管理器来终止掉进程呢? 解决办法 Commandspace 弹出搜索框吗,如下图: 输入“活动”进行搜索ÿ…...
Wekan看板安装部署与使用介绍
Wekan看板安装部署与使用介绍 1. Wekan简介 Wekan 是一个开源的看板式项目管理工具,它的配置相对简单,因为大多数功能都是开箱即用的。它允许用户以卡片的形式组织和跟踪任务,非常适合敏捷开发和日常任务管理。Wekan 的核心功能包括看板…...
Linux常用命令之passwd命令详解
passwd 命令详解 passwd 命令在 Linux 和 Unix 系统中用于更改用户的密码,以及进行账户锁定、密码失效等相关操作。它是系统管理员和普通用户日常管理用户账户安全的重要工具。以下是对 passwd 命令的详细说明,包括其语法、选项和示例。 基本语法 pas…...
【django】扩展
1. Promise 1.1 对象和状态 是什么?是前端开发时js中的一个对象(包裹)。【对象】【异步请求】# 对象中有一个状态的值,status # 创建对象,不赋值,statuspendding let v1 new Promise(function(resolve, …...
Vue3 生命周期钩子详解
Vue3 生命周期钩子详解 简介 Vue3的生命周期钩子让我们能够在组件的不同阶段执行自定义代码。与Vue2相比,Vue3的生命周期钩子在Composition API中有了新的使用方式,但整体概念保持一致。 基础知识 Vue3中的生命周期钩子可以通过两种方式使用…...
LeetCode 力扣 热题 100道(八)相交链表(C++)
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意,函数返回结果后&…...
RabbitMQ2:介绍、安装、快速入门、数据隔离
欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…...
Docker Seata分布式事务保护搭建 DB数据源版搭建 结合Nacos服务注册
介绍 Seata(Simple Extensible Autonomous Transaction Architecture)是一个开源的分布式事务解决方案,旨在为微服务架构中的分布式系统提供事务管理支持。Seata 通过提供全局事务管理,帮助开发者在分布式环境中保持数据一致性 …...
elasticsearch7.10.2集群部署带认证
安装elasticsearch rpm包安装 下载地址 https://mirrors.aliyun.com/elasticstack/7.x/yum/7.10.2/ 生成证书 #1.生成CA证书 # 生成CA证书,执行命令后,系统还会提示你输入密码,可以直接留空 cd /usr/share/elasticsearch/bin ./elasticsearch-certutil ca#会在/usr/share/el…...
opencv-python 分离边缘粘连的物体(距离变换)
import cv2 import numpy as np# 读取图像,这里添加了判断图像是否读取成功的逻辑 img cv2.imread("./640.png") # 灰度图 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 高斯模糊 gray cv2.GaussianBlur(gray, (5, 5), 0) # 二值化 ret, binary cv2…...
UVM 验证方法学之interface学习系列文章(七)高级 《bind 操作》(4)级联
在 SystemVerilog 中,bind 操作符用于将一个模块或接口实例绑定到另一个模块或接口的层次结构中。这在很多情况下非常有用,尤其是当你需要在不修改原始模块代码的情况下,添加或替换某些组件时。bind 操作符常用于仿真和测试平台中,以便灵活地组织测试环境。 前面的文章,我…...
08 —— Webpack打包图片
【资源模块 | webpack 中文文档 | webpack中文文档 | webpack中文网】https://www.webpackjs.com/guides/asset-modules/?sid_for_share99125_3 Webpack打包图片以8KB为临界值判断 大于8KB的文件:发送一个单独的文件并导出URL地址 小于8KB的文件:导出一…...
goframe开发一个企业网站 MongoDB 完整工具包19
1. MongoDB 工具包完整实现 (mongodb.go) package mongodbimport ("context""fmt""time""github.com/gogf/gf/v2/frame/g""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options" )va…...
从ES的JVM配置起步思考JVM常见参数优化
目录 一、真实查看参数 (一)-XX:PrintCommandLineFlags (二)-XX:PrintFlagsFinal 二、堆空间的配置 (一)默认配置 (二)配置Elasticsearch堆内存时,将初始大小设置为…...
Oracle JDK(通常简称为 JDK)和 OpenJDK区别
Java 的开发和运行时环境主要由两种实现主导:Oracle JDK(通常简称为 JDK)和 OpenJDK。尽管它们都基于同一个代码库,但在一些关键点上有所区别。以下是详细的对比: 1. 基础代码 Oracle JDK: 基于 OpenJD…...
格约减技术的工作原理
1. 格基约减的定义和目标 格基约简的目标是找到一组新的基,使得这些基向量的大小满足特定的不等式,并且这些基向量更加趋于正交。 2. LLL算法的基本原理 LLL算法通过一系列变换实现向量基底的逐步优化,最终到达一个“约减”基底。这个约减…...
M|横道世之介
rating: 8.0 豆瓣: 8.8 上映时间: “2013” 类型: M剧情爱情 导演: 冲田修一 Shichi Okita 主演: 冲田修一 Shichi Okita吉高由里子 Yuriko Yoshitaka 国家/地区: 日本 片长/分钟: 160分钟 M|横道世之介 横道世之介是一个热情、纯真的人,大家…...
el-select 和el-tree二次封装
前言 本文章是本人在开发过程中,遇到使用树形数据,动态单选或多选的需求,element中没有这种组件,故自己封装一个,欢迎多多指教 开发环境:element-UI、vue2 组件效果 单选 多选 组件引用 <treeselec…...
RocketMQ: Broker 使用指南
Broker 配置参数 获取 Broker 的默认配置 $ sh mqbroker -m Broker 启劢时,如何加载配置 ### 第一步生成 Broker 默认配置模版 sh mqbroker -m > broker.p ### 第二步修改配置文件, broker.p ### 第三步加载修改过的配置文件 nohup sh mqbroker -c broker.pBrok…...
ubuntu安装ros1
以Ubuntu 18.04为例: 1.如果源没有切换到国内的建议切换 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo vi /etc/sources.list删除原来的源切换到清华大学源 # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 de…...
C++ 中的模板特化和偏特化
模版特化是为特定的模版参数类型提供提供专门的实现。 当需要为特定类型的模板参数提供不同的实现时,可以使用模板特化。模板特化允许你为特定的模板参数类型编写专门的代码,而不是使用通用的模板代码。 例如,对于一个通用的模板函数&#…...
CTFHUB--yeeclass-web
复现平台CTFHUB靶机为一个完整类论坛网页,题目给了服务端完整代码 代码审计 /src/submit.php Line56-63: 可以看到提交数据存入的时候将$_SESSION["username"]."_"作为前缀,生成了一个uniqid。uniqid的生成方式即{sec:08x}{usec:0…...
GM、BP、LSTM时间预测预测代码
GM clc; clear; close all;%% 数据加载和预处理 [file, path] uigetfile(*.xlsx, Select the Excel file); filename fullfile(path, file); time_series xlsread(filename);% 确保数据是一列 time_series time_series(:);% 归一化数据 min_val min(time_series); max_v…...
2022 年中高职组“网络安全”赛项-海南省省竞赛任务书-1-B模块B-1-Windows操作系统渗透测试
前言 本章节我将带领大家一起重新模拟操作一次Windows渗透测试模块,并加固的流程。 任务概览 环境部署 我的实验复现环境: 服务器Windows server 2008 R2 攻击机Kali Linux 场景操作系统Windows 7 额外还有台交换机支持: 这里我使用的是…...
【6】STM32·FreeRTOS·列表和列表项
目录 一、列表和列表项的简介 1.1、列表 1.2、列表项 1.3、迷你列表项 1.4、列表和列表项的关系 二、列表相关API函数介绍 2.1、初始化列表vListInitialise() 2.2、初始化列表项vListInitialiseItem() 2.3、列表插入列表项vListInsert() 2.4、列表末尾插入列表项vLis…...
嵌入式硬件电子电路设计(五)MOS管详解(NMOS、PMOS、三极管跟mos管的区别)
引言:在我们的日常使用中,MOS就是个纯粹的电子开关,虽然MOS管也有放大作用,但是几乎用不到,只用它的开关作用,一般的电机驱动,开关电源,逆变器等大功率设备,全部使用MOS管…...
Leetcode 最长回文子串
目录 解法1:递归算法 解法2:Map取同字母位置法 解法3:中心扩展法 解法4:动态规划法 解法5: Manacher算法 示例 1: 输入:s "babad" 输出:"bab" 解释:&quo…...