当前位置: 首页 > news >正文

【算法】动态规划解决背包问题

应用场景——01背包问题

有一个背包,背包的容量为 4,现有如下物品

要求

1.目标为装入背包的总价值最大,并且重量不超出

2.要求装入的物品不能重复

动态规划算法介绍

1.动态规划算法的核心是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法

2.动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解

3.与分治算法不同的是,适合于用动态规划求解的问题,经分解得到的子问题往往不是相互独立的(即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解)

4.动态规划可以通过填表的方式来逐步推进,得到最优解

背包问题思路分析

背包问题主要是指一个给定容量的背包、若干具有一定价值和一定重量的物品,如何选择物品放入背包使物品的总价值最大。其中又分为 01背包和完全背包(完全背包指的是:每种物品都有无限件可用)

这里的问题属于 01背包,即每个物品最多放一个。而完全背包可以转化为 01背包

算法的主要思想

利用动态规划来解决,每次遍历到的第 i 个物品,根据 v[i] 和 w[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.当 w[i] <= j 时: 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]] 表示把上一个商品装到剩余空间为 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 = val.length;//创建一个二维数组,表int[][] v = new int[n + 1][m + 1];//初始化第一行和第一列,在本程序中可以不做处理,因为默认值是 0for (int i = 0; i < v.length; i++) {v[i][0] = 0;  //第一列设置为 0}for (int i = 0; i < v[0].length; i++) {v[0][i] = 0;  //第一行设置为 0}//根据前面得到的公式来动态规划处理for (int i = 1; i < v.length; i++) {  //不处理第一行,i 是从 1 开始的for (int j = 1; j < v[0].length; j++) {  //不处理第一列,j 是从 1 开始的if (w[i-1] > j) {v[i][j] = v[i-1][j];} else {v[i][j] = Math.max(v[i-1][j], val[i-1] + v[i-1][j - w[i-1]]);}}}//输出以下 vfor (int i = 0; i < v.length; i++) {for (int j = 0; j < v[0].length; j++) {System.out.print(v[i][j] + " ");}System.out.println();}}
}
运行结果

为了记录商品存放到背包的情况,我们不能直接 调用求最大值方法,需要使用 if-else 处理

以下是优化以后的代码

public class KnapsackProblem {public static void main(String[] args) {int[] w = {1, 4, 3};  //物品的价值int[] val = {1500, 3000, 2000};  //物品的重量int m = 4;  //背包的容量int n = val.length;//创建一个二维数组,表int[][] v = new int[n + 1][m + 1];//为了记录放入商品的情况,定义一个二维数组int[][] path = new int[n+1][m+1];//初始化第一行和第一列,在本程序中可以不做处理,因为默认值是 0for (int i = 0; i < v.length; i++) {v[i][0] = 0;  //第一列设置为 0}for (int i = 0; i < v[0].length; i++) {v[0][i] = 0;  //第一行设置为 0}//根据前面得到的公式来动态规划处理for (int i = 1; i < v.length; i++) {  //不处理第一行,i 是从 1 开始的for (int j = 1; j < v[0].length; j++) {  //不处理第一列,j 是从 1 开始的if (w[i-1] > j) {v[i][j] = v[i-1][j];} else {//v[i][j] = Math.max(v[i-1][j], val[i-1] + v[i-1][j - w[i-1]]);if (v[i-1][j] < val[i-1] + v[i-1][j-w[i-1]]) {v[i][j] = val[i-1] + v[i-1][j-w[i-1]];//把当前的情况记录到 pathpath[i][j] = 1;} else {v[i][j] = v[i-1][j];}}}}//输出以下 vfor (int i = 0; i < v.length; i++) {for (int j = 0; j < v[0].length; j++) {System.out.print(v[i][j] + " ");}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.printf("第%d个商品放入到背包\n", i);j -= w[i-1];}i--;}}
}
运行结果

相关文章:

【算法】动态规划解决背包问题

应用场景——01背包问题 有一个背包&#xff0c;背包的容量为 4&#xff0c;现有如下物品 要求 1.目标为装入背包的总价值最大&#xff0c;并且重量不超出 2.要求装入的物品不能重复 动态规划算法介绍 1.动态规划算法的核心是&#xff1a;将大问题划分为小问题进行解决&…...

day09 工作日报表

日期 30日07月2024年 任务安排 今天主要就是讲了security类工作的原理&#xff0c;然后就是让我们自己做项目 工作中的问题 今天做项目的时候发现有时候用postman测试返回20001&#xff0c;说错误见控制台&#xff0c;但是控制台一片祥和&#xff0c;于是就尝试用tr…...

C++学习之路(1)— 第一个HelloWorld程序

C学习之路&#xff08;1&#xff09;— 第一个HelloWorld程序 一、前言 C在C语言的基础上添加了对面向对象编程和泛型编程的支持&#xff0c;在 20世纪90年代便是最重要的编程语言之一&#xff0c;并在21世纪仍保持强劲势头。C继承了C语言高效、简洁、快速和可移植性的传统。 …...

python3 pyside6图形库学习笔记及实践(三)

目录 前言菜单栏相关控件使用QtDesigner快速构建菜单栏结构语法 上下文菜单概念为窗体添加上下文菜单为控件添加上下文菜单 折叠菜单资源的加载内置图标Rcc的使用创建资源文件加载资源文件 前言 本系列文章为b站PySide6教程以及官方文档的学习笔记 原视频传送门&#xff1a;【…...

03 库的操作

目录 创建查看修改删除备份和恢复查看连接情况 1. 创建 语法 CRATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] …] create_specification:  CHARACTER SET charset_name  CPLLATE collation_name 说明&#xff1a; 大写的标识关键…...

嵌入式人工智能(44-基于树莓派4B的扩展板-LED按键数码管TM1638)

树莓派性能非常强悍&#xff0c;但是对于某些复杂的项目来说&#xff0c;会出现心有余而口不足的情况&#xff0c;为了解决这类问题&#xff0c;可以在树莓派上使用扩展板&#xff0c;我们介绍几款常见的扩展板&#xff0c;不仅可以扩展到树莓派&#xff0c;其他单片机或嵌入式…...

linux通过抓包工具tcpdump查看80端口访问量情况

方法&#xff1a; tcpdump -i ens32 -tn dst port 80 -c 10 | awk -F"." {print $1"."$2"."$3"."$4} | sort | uniq -c | sort -nr |head -n 10 #-i&#xff1a;指定端口 #-t&#xff1a;在输出的每一行不打印时间戳 #-n&#xff…...

Mac 上安装和卸载 SDKMAN 及管理多个 JDK

前言 当电脑上有多个 JDK 环境的时候&#xff0c;切换管理比较麻烦&#xff0c;这时候可以使用 SDKMAN 来安装、管理 JDK。 一、安装 SDKMAN! 1. 安装前置条件 首先&#xff0c;确保已经安装了 curl 。如果没有&#xff0c;可以通过 Homebrew 来安装&#xff1a; brew inst…...

字节测开一面面经

1 . 自我介绍 2 . 讲一下常见的数据结构 : 讲了数组,set,list,map,树&#xff0c;图&#xff0c;队列 &#xff0c; 栈等 ; 3 . 讲一下java反射场景和作用 ; 4 . 讲一下你了解的机器学习算法 ; 5 . 我讲完ML之后 &#xff0c; 问了knn和贝叶斯的使用的场景区别(没答上来) ; 6 .…...

HTML 段落

HTML 段落 概述 HTML&#xff08;超文本标记语言&#xff09;是构建网页的标准语言&#xff0c;而段落是构成网页内容的基本单元。在HTML中&#xff0c;段落是通过<p>标签来定义的。本文将详细介绍HTML段落的相关知识&#xff0c;包括段落的基本结构、样式设置、以及在…...

【Mind+】掌控板入门教程04 迷你动画片

还记得小时候每天放学必看的动画片吗&#xff1f;还记得那些年陪伴我一起长大的卡通人物吗&#xff1f;勇救爷爷的葫芦娃&#xff0c;我们的朋友小哪吒&#xff0c;相信这些经典的动画形象已经成为了一代人童年的美好回忆。今天就让我们用掌控板来制作一部迷你动画片吧。 项目示…...

文件上传漏洞-HackBar使用

介绍 HackBar 是一个用于浏览器的扩展插件&#xff0c;主要用于进行网络渗透测试和安全评估。它提供了一系列方便的工具和功能&#xff0c;可以帮助用户执行各种网络攻击和测试&#xff0c;包括 XSS、SQL 注入、CSRF、路径穿越等 下载地址 可以到github上面去下载&#xff0…...

鸿蒙媒体开发【相机数据采集保存】音频和视频

相机数据采集保存 介绍 本示例主要展示了相机的相关功能&#xff0c;使用libohcamera.so 接口实现相机的预览、拍照、录像、前后置摄像头切换进行拍照、录像&#xff0c;以及对焦、曝光等控制类功能。 效果预览 使用说明 弹出是否允许“CameraSample”使用相机&#xff1f;…...

【java基础】徒手写Hello, World!程序

文章目录 前提&#xff1a;java环境变量配置使用vscode编写helloworld解析 前提&#xff1a;java环境变量配置 https://blog.csdn.net/xzzteach/article/details/140869188 使用vscode编写helloworld code .为什么用code看下图 报错了&#xff01;&#xff01;&#xff01;&…...

对 vllm 与 ollama 的一些研究

今天咱们来聊聊 vllm 和 ollama 这两个听起来就挺酷的玩意儿。这俩都是现在 AI 圈子里的大明星&#xff0c;专门用来让那些超大型的 AI 模型跑得更顺溜。 先说说 vllm 吧&#xff0c;这家伙的绝活儿是剪枝。啥叫剪枝呢&#xff1f;想象一下&#xff0c;你有个花园&#xff0c;…...

浅谈基础的图算法——强联通分量算法(c++)

文章目录 强联通分量SCC概念例子有向图的DFS树代码例题讲解[POI2008] BLO-Blockade题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 思路AC代码 【模板】割点&#xff08;割顶&#xff09;题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示…...

C#:通用方法总结—第13集

大家好&#xff0c;今天继续讲解我们的通用方法系列。 下面是今天要介绍的通用方法&#xff1a; &#xff08;1&#xff09;这个通用方法为ug获取选择圆边的圆心 /// <summary> /// ug获取选择圆边的圆心 /// </summary> /// <param name"a">&l…...

AI答题应用平台相关面试题

目录 1、请介绍整个系统后端的架构设计&#xff0c;有哪些模块以及各模块之间的关系&#xff1f; 2、你在项目中是如何设计库表的&#xff1f;可以从字段、索引、关联等方面回答。 3、为什么使用策略模式来封装不同的应用评分算法&#xff1f;它有哪些好处&#xff1f;具体如…...

树莓派NAS系统搭建教程:使用Flask和SQLite实现HTTP/HTTPS文件管理(代码示例)

一、项目概述 随着物联网&#xff08;IoT&#xff09;技术的发展&#xff0c;数据存储和共享需求日益增长。本文将介绍如何利用树莓派&#xff08;Raspberry Pi&#xff09;搭建一个网络附加存储&#xff08;NAS&#xff09;系统&#xff0c;以实现数据的集中管理、共享和访问…...

mysql如何储存大量数据,分库存分表的建议和看法

MySQL 在处理大量数据时&#xff0c;分库分表是常见的策略&#xff0c;可以有效提升数据库的性能和扩展性。下面是关于 MySQL 分库分表的建议和看法&#xff1a; 1. 何时考虑分库分表 数据量大&#xff1a;当单一数据库实例无法处理大规模数据或达到性能瓶颈时&#xff0c;可以…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!

本文介绍了一种名为AnomalyAny的创新框架&#xff0c;该方法利用Stable Diffusion的强大生成能力&#xff0c;仅需单个正常样本和文本描述&#xff0c;即可生成逼真且多样化的异常样本&#xff0c;有效解决了视觉异常检测中异常样本稀缺的难题&#xff0c;为工业质检、医疗影像…...