【算法-动态规划】0-1 背包问题

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
img

  • 推荐:kuan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
    • 檀越剑指大厂系列:全面总结 java 核心技术点,如集合,jvm,并发编程 redis,kafka,Spring,微服务,Netty 等
    • 常用开发工具系列:罗列常用的开发工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
    • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

        • 1.问题描述
        • 2.问题解析
        • 3.二维解答
        • 4.一维解答
        • 5.继续优化

1.问题描述

0-1 背包问题(0-1 Knapsack Problem)是一个经典的组合优化问题,通常出现在计算机科学和数学中。它的背景是在给定一组物品,每个物品有一个特定的重量和价值,以及一个固定容量的背包。问题的目标是确定应该选择哪些物品放入背包,以使得它们的总重量不超过背包的容量,并且它们的总价值最大化。

0-1 背包问题之所以称为 0-1,是因为对于每个物品,你只有两种选择:要么将它放入背包(表示为 1),要么不放入背包(表示为 0)。不能将一个物品部分放入背包。

2.问题解析
/*1. n个物品都是固体,有重量和价值2. 现在你要取走不超过 10克 的物品3. 每次可以不拿或全拿,问最高价值是多少编号 重量(g)  价值(元)                        简称1   4       1600           黄金一块   400     A2   8       2400           红宝石一粒 300     R3   5       30             白银一块          S4   1       1_000_000      钻石一粒          D1_001_630 贪心解1_002_400 正确解
*/
/*0   1   2   3   4   5   6   7   8   9   100   0   0   0   0   A   A   A   A   A   A   A       黄金1   0   0   0   0   A   A   A   A   R   R   R       红宝石2   0   0   0   0   A   A   A   A   R   R   R       白银3   0   D   D   D   D   DA  DA  DA  DA  DR  DR      钻石if(装不下) {dp[i][j] = dp[i-1][j]} else { 装得下dp[i][j] = max(dp[i-1][j], item.value + dp[i-1][j-item.weight])}
*/
3.二维解答
static class Item {int index;String name;int weight;int value;public Item(int index, String name, int weight, int value) {this.index = index;this.name = name;this.weight = weight;this.value = value;}@Overridepublic String toString() {return "Item(" + name + ")";}
}public static void main(String[] args) {Item[] items = new Item[]{new Item(1, "黄金", 4, 1600),new Item(2, "宝石", 8, 2400),new Item(3, "白银", 5, 30),new Item(4, "钻石", 1, 10_000),};System.out.println(select(items, 10));
}static int select(Item[] items, int total) {int[][] dp = new int[items.length][total + 1];print(dp);final Item item0 = items[0];for (int j = 0; j < total + 1; j++) {if (j >= item0.weight) {//装得下dp[0][j] = item0.value;}}print(dp);for (int i = 1; i < items.length; i++) {final Item item = items[i];for (int j = 0; j < total + 1; j++) {if (j >= item.weight) {//装得下dp[i][j] = Integer.max(dp[i - 1][j], item.value + dp[i - 1][j - item.weight]);} else {dp[i][j] = dp[i - 1][j];}}print(dp);}return dp[items.length - 1][total];
}static void print(int[][] dp) {System.out.println(StringUtil.repeat("   " + "-", 20));Object[] array = IntStream.range(0, dp[0].length + 1).boxed().toArray();System.out.printf((StringUtil.repeat("%5d ", dp[0].length)) + "%n", array);for (int[] d : dp) {array = Arrays.stream(d).boxed().toArray();System.out.printf((StringUtil.repeat("%5d ", d.length)) + "%n", array);}
}
4.一维解答
static class Item {int index;String name;int weight;int value;public Item(int index, String name, int weight, int value) {this.index = index;this.name = name;this.weight = weight;this.value = value;}@Overridepublic String toString() {return "Item(" + name + ")";}
}public static void main(String[] args) {Item[] items = new Item[]{new Item(1, "黄金", 4, 1600),new Item(2, "宝石", 8, 2400),new Item(3, "白银", 5, 30),new Item(4, "钻石", 1, 10_000),};System.out.println(select(items, 10));
}static int select(Item[] items, int total) {int[] dp = new int[total + 1];System.out.println(Arrays.toString(dp));final Item item0 = items[0];for (int j = 0; j < total + 1; j++) {if (j >= item0.weight) {//装得下dp[j] = item0.value;}}System.out.println(Arrays.toString(dp));for (int i = 1; i < items.length; i++) {final Item item = items[i];for (int j = total; j > 0; j--) {if (j >= item.weight) {//装得下dp[j] = Integer.max(dp[j], item.value + dp[j - item.weight]);}}System.out.println(Arrays.toString(dp));}return dp[total];
}
5.继续优化
static class Item {int index;String name;int weight;int value;public Item(int index, String name, int weight, int value) {this.index = index;this.name = name;this.weight = weight;this.value = value;}@Overridepublic String toString() {return "Item(" + name + ")";}
}public static void main(String[] args) {Item[] items = new Item[]{new Item(1, "黄金", 4, 1600),new Item(2, "宝石", 8, 2400),new Item(3, "白银", 5, 30),new Item(4, "钻石", 1, 10_000),};System.out.println(select(items, 10));
}static int select(Item[] items, int total) {int[] dp = new int[total + 1];for (int i = 0; i < items.length; i++) {final Item item = items[i];for (int j = total; j > 0; j--) {if (j >= item.weight) {//装得下dp[j] = Integer.max(dp[j], item.value + dp[j - item.weight]);}}System.out.println(Arrays.toString(dp));}return dp[total];
}

注意:内层循环需要倒序,否则 dp[j - item.weight] 的结果会被提前覆盖

觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img

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

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

相关文章

红队专题-Cobalt strike 4.x - Beacon重构

红队专题 招募六边形战士队员重构后 Beacon 适配的功能windows平台linux和mac平台C2profile 重构思路跨平台功能免杀代码部分sysinfo包packet包config.go命令的执行shell、run、executepowershell powerpick命令powershell-importexecute-assembly 堆内存加密字符集 招募六边形…

【计算机网络笔记】数据交换之电路交换

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 文章目录 系列文章目录为什么需要数据交换数据交换的类型电路交换什么是多路复用&#xff1f;频分多路复用&#xff08;FDM&#xff09;时分多路复用&#xff08;TDM&#xff09;波分…

vue2.6 和 2.7对可选链的不同支持导致构建失败

有两个vue2项目&#xff0c;构建配置和依赖基本上都一样&#xff0c;但一个可以在 template 模板中使用可选链(?.)&#xff0c;另一个使用就报错。 但是报错的那个项目&#xff0c;在另一个同事那又不报错。 已知 node14 之后就支持可选链了&#xff0c;我和同事用的是 node…

如何压缩视频?视频压缩变小方法汇总

视频是我们日常生活中不可或缺的一部分&#xff0c;但视频文件往往会占用大量存储空间&#xff0c;这在传输和分享过程中可能成为一个瓶颈。 为了解决这一问题&#xff0c;我们可以通过压缩的方式减小视频大小&#xff0c;视频压缩是指在保证视频质量的前提下&#xff0c;通过…

池州市的城市环境融合:OLED透明拼接屏展现自然与现代的完美结合

池州是中国安徽省的一个地级市&#xff0c;位于该省的西南部。池州市辖区包括贵池区、东至县、石台县、青阳县等地。 池州市拥有悠久的历史和丰富的文化遗产&#xff0c;同时也以其独特的自然风光而闻名。 首先&#xff0c;让我们来了解一下池州的历史和景点。 池州的历史可…

面试题:说说Java线程的状态及转换

文章目录 为何要了解Java线程状态Java线程状态转换图Java线程有哪些状态&#xff1f;关于wait()放在while循环的疑问BLOCKED 和 WAITING 状态的区别和联系 为何要了解Java线程状态 线程是 JVM 执行任务的最小单元&#xff0c;理解线程的状态转换是理解后续多线程问题的基础。 …

网站为什么需要https证书以及如何申请

随着互联网的快速发展&#xff0c;网站的安全性问题越来越受到人们的关注。因此&#xff0c;越来越多的网站开始使用https证书&#xff0c;以保护用户的数据安全和隐私。那么&#xff0c;网站为什么需要https证书呢&#xff1f; 首先&#xff0c;https证书可以提供加密保护&…

ROS IMU 数据发布---rviz_imu_plugin的安装

ROS中发布IMU传感器消息 - 润新知 按照上述链接的方法执行 catkin_make install -DCMAKE_INSTALL_PREFIX/opt/ros/noetic 后报错 这个错误是因为在安装过程中&#xff0c;CMake无法将文件复制到目标路径。这可能是由于权限不足导致的。可以尝试使用以下命令更改目标文件夹的…

破解mariadb密码

破解mariadb密码 小白教程&#xff0c;一看就会&#xff0c;一做就成。 1.先停止mariadb systemctl stop mariadb.service 2.进单用户模式 mysqld_safe --skip-grant-tables & 3.登录mariadb mysql -uroot #&#xff08;不用密码也能登录&#xff09; 4.切换到mysql …

堆叠、集群技术

1.堆叠、集群技术的概述 堆叠、集群简介 堆叠&#xff08;iStack&#xff09;&#xff0c;将多台支持堆叠特性的交换机通过堆叠线缆连接在一起&#xff0c;从逻辑上虚拟成一台交换设备&#xff0c;作为一个整体参与数据转发。 集群&#xff08;Cluster Switch System&#xf…

Davinci 集成NvM协议栈的步骤

BSW添加NvM和MemIf模块 Mcal添加Fls、Fee和Crc模块 NvM中添加数据块&#xff0c;Fee中添加相应的数据块。Mcal如果使用EB生成&#xff0c;需要在EB中配置Fee&#xff0c;或Davinci中配置好之后把配置导入到EB中。 NvM和Fee模块配置中不要启用Polling。 Fee模块需要启用Eras…

解决uniapp里scroll-view横向滚动的问题

一、前言 本以为是一件很简单的事&#xff0c;结果浪费了整整一个上午&#xff0c;并且问题并没有全部解决....后来没办法&#xff0c;用了touchmove模拟的滑动&#xff0c;如果有好的解决方法麻烦告诉我...非常感谢~ 一、问题 其实我想要实现的功能很简单&#xff0c;就是一…

elasticsearch(ES)分布式搜索引擎04——(数据聚合,自动补全,数据同步,ES集群)

目录 1.数据聚合1.1.聚合的种类1.2.DSL实现聚合1.2.1.Bucket聚合语法1.2.2.聚合结果排序1.2.3.限定聚合范围1.2.4.Metric聚合语法1.2.5.小结 1.3.RestAPI实现聚合1.3.1.API语法1.3.2.业务需求1.3.3.业务实现 2.自动补全2.1.拼音分词器2.2.自定义分词器2.3.自动补全查询2.4.实现…

【iOS】Fastlane一键打包上传到TestFlight、蒲公英

Fastlane一键打包上传到TestFlight、蒲公英 前言一、准备二、探索一、Fastlane配置1、Fastlane安装2、Fastlane更新3、Fastlane卸载4、查看Fastlane版本5、查看Fastlane位置6、Fastlane初始化 二、Fastlane安装蒲公英插件三、Fastlane文件编辑1、Gemfile文件2、Appfile文件3、F…

【安全】 Java 过滤器 解决存储型xss攻击问题

文章目录 XSS简介什么是XSS?分类反射型存储型 XSS(cross site script)跨站脚本攻击攻击场景解决方案 XSS简介 跨站脚本( cross site script )为了避免与样式css(Cascading Style Sheets层叠样式表)混淆&#xff0c;所以简称为XSS。 XSS是一种经常出现在web应用中的计算机安全…

stm32学习笔记:EXIT中断

1、中断系统 中断系统是管理和执行中断的逻辑结构&#xff0c;外部中断是众多能产生中断的外设之一。 1.中断&#xff1a; 在主程序运行过程中&#xff0c;出现了特定的中断触发条件 (中断源&#xff0c;如对于外部中断来说可以是引脚发生了电平跳变&#xff0c;对于定时器来…

24v转12v电源芯片 24v转5v开关电源芯片AH7691

AH7691是一款高-效-率、高压降压型DC-DC转换器。该芯片固定在130KHz的开关频率下工作&#xff0c;能够提供3A的输出电流能力&#xff0c;并具有低纹波、***软启动功能、过压保护功能和温度保护。 AH7691还具备峰值限流功能&#xff0c;使电路设计更加简单化。该芯片内置集成了高…

JFLASH基本使用总结

注意&#xff0c;不同版本的操作略有不同&#xff0c;本教程以J-Flash V5.12f为例。 烧录文件 如果是刚打开J-Flash&#xff0c;会弹出这样的一个工程选择界面&#xff0c;可以选择已有工程&#xff0c;或者创建新的工程&#xff0c;我们这里选择创建新工程。 注意&#xff0…

ffmpeg从一个视频中提取音频

ffmpeg -i ~/video/video.mp4 -vn -acodec copy ~/video/audioFile.m4a 从video.mp4中提取音频到文件audioFile.m4a中 查看提取的音频文件 ffprobe ~/video/audioFile.m4a

技术先驱视角:长城汽车工程师揭秘Hi4技术的无限潜力

文 | 智能相对论 作者 | 沈浪 汽车行业的变革正在回归平衡和理性&#xff0c;混动市场再度掀起新的浪潮&#xff0c;以Hi4技术为代表的混合动力解决方案备受瞩目&#xff0c;并爆发出无限潜力。 日前&#xff0c;工信部等七个部门联合印发了《关于汽车行业稳增长工作方案&am…