动态规划之01背包问题

动态规划算法
  • 动态规划算法介绍
    • 动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法
    • 动态规划算法与分治法类似,其基本思想也是将待解决问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解
    • 与分治法不同的是,适合于动态规划求解的问题。经分解得到子问题往往不是互相独立的。(即下一个子阶段的求解是建立在上一个子阶段的基础上,进行进一步的求解)
    • 动态规划可以通过填表的方式来逐步推进,得到最优解
  • 应用场景-背包问题
    • 背包问题:有一个背包,容量为4磅,现有如下物品
      物品重量价格
      吉他(G)11500
      音响(S)43000
      电脑(L)32000
      • 要求达到的目标为装入背包的总价值最大,并且重量不超出
      • 要求装入的物品不能重复
    • 思路分析与图解
      • 背包问题主要是指一个给定容量的背包、若干具有一定价值和重量的物品,如何选择物品放入背包使物品的价值最大。其中又分为01背包完全背包(完全背包指的是:每种物品都有无限件可用)
      • 这里的问题属于01背包,即每个物品最多放一个。而无线背包可以转化为01背包
      • 算法的主要思想是,利用动态规划来解决。每次遍历到的第i个物品,根据w[i]和v[i]来确定是否需要将该物品放入背包中。即对于给定的n个物品,设v[i]、w[i]分别为第i个物品的价值和重量,C为背包的容量。再令v[i][j]表示再前i个物品中能够装入容量为j的背包中的最大价值。则我们得到如下结果
      1. v[i][0]=v[0][j]=0;//表示填入表第一行和第一列是0
      2. 当w[i]>j时:v[i][j]=v[i-1][j] // 当准备加入新增的商品容量大于当前背包的容量时,就直接使用上一个单元格的装入策略
      3. 当j>=w[i]时,v[i][j]=max{v[i-1][j],v[i]+v[i-1][j-w[i]]}
      // 当准备加入的新增的商品的容量小于等于当前背包的容量
      // 装入的方式
      v[i-1][j]:指上一个单元格装入的最大值
      v[i]:当前商品的价值
      v[i-1][j-w[i]]:装入i-1商品,到剩余空间j-w[i]的最大值
      
      • 图解
        背包问题
    • 代码实现
    public class KnapsackProblem {public static void main(String[] args) {int[] w = {1,4,3}; // 物品的重量int val[] = {1500,3000,2000}; // 物品的价值int m = 4; // 背包的容量int n = w.length; // 物品的个数// v[i][j]表示在前j个物品中能够装入容量为j的背包中的最大价值int[][] v = new int[n+1][m+1];// 记录有没有放入对应的商品.1表示放入了int[][] path = new int[n+1][m+1];// 初始化第一行和第一列,在本程序中可以不处理,因为默认是0// 根据前面得到公式来动态规划处理// 跳过第一行和第一列for(int i = 1; i < v.length;i++) {for(int j = 1; j < v[0].length;j++) {// 当前物品大于背包容量if(w[i-1] > j) {v[i][j] = v[i-1][j];}else {// 当前物品大于等于背包容量int newValue = val[i - 1] + v[i - 1][j - w[i - 1]];if(v[i - 1][j] < newValue) {v[i][j] = newValue;// 表明把当前商品放入到背包中path[i][j] = 1;}else {v[i][j] = v[i - 1][j];}}}}// 输出以下,看看目前的情况for (int i = 0; i < v.length; i++) {for (int j = 0; j < v[i].length; j++) {System.out.print(v[i][j] + "  ");}System.out.println();}System.out.println("------------------");// 输出最后我们放入的是那些商品int i = path.length - 1; // 最后一个商品int j = path[0].length - 1;while(i > 0 && j > 0) {if(path[i][j] == 1) {System.out.println("把商品" + i + "放入背包中");j -= w[i-1];}i--;}}
    }
    

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

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

相关文章

人大金仓新建用户,并且赋值查询权限

-- 1. 创建用户 visitor&#xff0c;并且设置密码 CREATE USER visitor WITH PASSWORD 1234qwer; -- 2. 授予该用户连接到数据库 "yonbip_db" 的权限 GRANT CONNECT ON DATABASE yonbip_db TO visitor; -- 3. 假设你要让 visitor 查询的模式是 public&#xff08;或…

学习笔记丨信号处理新趋势:量子计算将如何颠覆传统DSP?

在算力需求爆炸式增长的今天&#xff0c;传统数字信号处理&#xff08;DSP&#xff09;芯片正面临物理极限的严峻挑战。当经典计算机架构在摩尔定律的黄昏中挣扎时&#xff0c;量子计算正以颠覆性姿态崛起&#xff0c;准备重新定义信号处理的未来图景。 目录 传统DSP的瓶颈&am…

react day.js使用及经典场景

简介 Day.js 是一个轻量级的 JavaScript 日期库&#xff0c;它提供了简单易用的 API 来处理日期和时间。以及更加轻量级&#xff0c;并且具有更快的性能。 安装 npm install dayjs 使用 import dayjs from "dayjs";dayjs().format("YYYY-MM-DD HH:mm:ss&qu…

【机器学习深度学习】线性回归

目录 一、定义 二、举例说明 三、 数学形式 四、 训练过程&#xff08;机器怎么学会这条线&#xff1f;&#xff09; 五、在 PyTorch 中怎么实现线性回归&#xff1f; 六、如果你学懂了线性回归&#xff0c;你也能理解这些 七、综合应用&#xff1a;线性回归示例 7.1 执…

如何在 Manjaro Linux 上安装 .NET Core

.NET 是一个开源的开发框架平台,可在所有流行的操作系统(如 Windows、Linux 和 macOS)上免费使用和安装。它是跨平台的,是主要由微软员工在 .NET 基金会下开发的专有 .NET Framework 的继承者。.NET 是一个统一的平台,用于开发各种操作系统上的软件,如 Web、移动、桌面应…

Mysql解惑(一)

使用 or 可能不走索引 使用 union替代 使用in&#xff0c;可能不走索引 如果优化&#xff1a; 临时表强制索引exists代替

基于机器学习的侧信道分析(MLSCA)Python实现(带测试)

一、MLSCA原理介绍 基于机器学习的侧信道分析(MLSCA)是一种结合传统侧信道分析技术与现代机器学习算法的密码分析方法。该方法通过分析密码设备运行时的物理泄漏信息(如功耗、电磁辐射等)&#xff0c;利用机器学习模型建立泄漏数据与密钥信息之间的关联模型&#xff0c;从而实…

【LLM】位置编码

【LLM】位置编码 1 绝对位置嵌入为什么用 1000 0 2 t d 10000^{\frac{2t}{d}} 10000d2t​? 2 相对位置嵌入2.1 Shaw等人的方法&#xff08;2018&#xff09;2.2 Dai等人的方法&#xff08;2019&#xff09;2.3 Raffel 等人的方法&#xff08;2020&#xff09;2.4 He 等人的方法…

Java 根据分组key构建合并数据集

文章目录 前言背景总结 前言 请各大网友尊重本人原创知识分享&#xff0c;谨记本人博客&#xff1a;南国以南i、 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 背景 Java 需要返回一组数据供前端展示&#xff0c;获取到的数据格式如下&#xff1a; …

Linux平台Oracle开机自启动设置

网上和官方文档已经有不少介绍如何设置开机启动Oracle实例的文章(Linux平台)&#xff0c;不过以sysvinit和service这种方式居多。最近遇到了UAT环境的服务器打补丁后需要重启服务器的情况&#xff0c; 需要DBA去手工启动Oracle实例的情形&#xff0c;和同事讨论&#xff0c;决定…

商品中心—商品B端搜索系统的实现文档(二)

8.步骤四&#xff1a;基于索引实现搜索功能 (1)基于suggest索引的自动补全实现 实现自动补全的代码比较简单&#xff0c;其原理是&#xff1a;把搜索词汇和倒排索引里的所有前缀匹配的词条进行score比较&#xff0c;然后把分数最高的那些返回&#xff0c;其中会涉及到suggest索…

Codeforces Round 1027 (Div. 3)

A. Square Year 题目大意 给你一个四个字符的字符串&#xff0c;代表一个数字s 问是否存在a,b两个数字&#xff0c;使得 ( a b ) 2 s (ab)^2s (ab)2s 思路 如果s是奇数或不能被开根号一定不行 设sq为s开根号后的结果 将sq一分为2&#xff0c;考虑sq/2有没有余数的情况 //…

时序数据库IoTDB的架构、安装启动方法与数据模式总结

一、IoTDB的架构 IoTDB的架构主要分为三个部分&#xff1a; ‌时序文件&#xff08;Tsfile&#xff09;‌&#xff1a; 专为时序数据设计的文件存储格式。支持高效的压缩和查询性能。可独立使用&#xff0c;并可通过TsFileSync工具同步至HDFS进行大数据处理。 ‌数据库引擎‌…

ArrayList和LinkedList详解

在Java后端开发中&#xff0c;集合框架是我们日常编程不可或缺的工具&#xff0c;它为数据存储和操作提供了丰富的实现方式。作为Java集合框架中最常用的两种List实现&#xff0c;ArrayList和LinkedList各自具有独特的特性和适用场景。 1. 基本概念 1.1 ArrayList的定义与特性…

警惕微软Entra ID风险:访客账户存在隐蔽的权限提升策略

访客用户订阅权限漏洞解析 微软Entra ID的订阅管理存在访问控制缺陷&#xff0c;允许访客用户在受邀租户中创建和转移订阅&#xff0c;同时保留对这些订阅的完全所有权。访客用户只需具备在源租户创建订阅的权限&#xff0c;以及受邀成为外部租户访客的身份即可实施此操作。这…

EEG分类攻略2-Welch 周期图

在EEG信号处理的上下文中&#xff0c;使用Welch方法来估算信号的功率谱密度&#xff08;Power Spectral Density, PSD&#xff09;是一种常见的做法。你的代码片段是利用**scipy.signal.welch**函数来进行功率谱密度估算&#xff0c;并且涉及到一些关键的参数和步骤。让我们逐步…

开疆智能CCLinkIE转ModbusTCP网关连接脉冲计数器配置案例

本案例是三菱PLC通过CCLinkIE转ModbusTCP网关连接脉冲计数器的配置案例&#xff0c;具体配置如下。 配置过程&#xff1a; 首先设置从站通讯参数 主要设置IP地址&#xff0c;工作模式以及端口号&#xff08;Modbus默认502&#xff09; 找到通讯点表&#xff0c;找到需要读写的…

gRPC 使用(python 版本)

.proto 文件 .proto 文件 是 gRPC 和 Protocol Buffers 的接口定义文件&#xff0c;它描述了&#xff1a; 要传递什么数据&#xff08;也就是消息体 message&#xff09;。要暴露什么接口&#xff08;也就是服务 service 和它们的 方法&#xff09;。 也就是一份规范文件&am…

VMware安装

勾选【增强型键盘驱动程序】 #后期虚拟机用鼠标键盘比较好用 VMware创建主机Windows2 选择类型配置【自定义】 安装客户机操作系统【稍后安装操作系统】 客户机操作系统【Microsoft Windows】,版本选Windows最高版本 【固件类型】默认UEFI 【处理器配置】选1个处理…

【沉浸式解决问题】微服务子模块引入公共模块的依赖后无法bean未注入

目录 一、问题描述二、场景还原三、原因分析四、解决方案五、拓展知识参考文献 一、问题描述 在微服务项目中的公共模块进行了Mybatis Plus配置&#xff0c;创建了配置类并添加了Configuration注解&#xff0c;其他模块引入该模块后不生效 我这里是在Mybatis Plus公共模块中注…