最优解-背包问题

问题描述

给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。

基本思路

目标是书包内物品的总价值,而变量是物品和书包的限重,所以我们可定义状态dp:dp[i][j]表示将前i件物品装进限重为j的背包可以获得的最大价值, 0<=i<=N, 0<=j<=W
不放物品i:由dp[i-1][j]推出,即背包容量为j,里面不放物品i的最大价值,此时dp[i][j]就是dp[i - 1][j]。物品i的重量大于物品j的重量,导致放不进去,只能用之前的重量
放物品:由dp[i-1][j-weight[i]]推出,dp[i-1][j-weight[i]] 为背包容量为j-weight[i]的时候不放物品i的最大价值,那么dp[i-1][j-weight[i]] + value[i] (物品i的价值),就是背包放物品i得到的最大价值。
最终,在dp[i][j]最后一个单元格里(即最后一行最后一列所在位置)就存放着该背包所能装下的最大价值。

package com.algorithm;import java.util.Arrays;public class Knapsack {public static void main(String[] args) {int w[] = new int[] {1,4,3}; //每个物品的重量int v[] = new int[] {1500,3000,2000}; //每个物品的价值int m = 4; //背包容量int n = v.length; //物品的个数//记录放入商品的情况,我们定义一个二维数组int[][] dp = new int[n+1][m+1];//定义状态转移机int[][] value = new int[n+1][m+1];//初始化for (int i = 0; i < value.length; i++) {value[i][0] = 0; //第一行value[0][i] = 0;//第一列}for (int i = 1; i < n+1; i++) {for (int j = 1; j < m+1; j++) {int index = i-1; //下标从0开始if(w[index] > j) {value[i][j] = value[i-1][j];//超重了} else {value[i][j] = Math.max(value[i-1][j],value[i-1][j-w[index]]+v[index]);}System.out.print(value[i][j]+",");}System.out.println("");}System.out.println("max value="+value[n][m]);}
}

输出结果:
1500,1500,1500,1500,
1500,1500,1500,3000,
1500,1500,2000,3500,
max value=3500

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

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

相关文章

Verilog基础:强度建模(一)

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 一、强度建模基础 Verilog HDL提供了针对线网信号0、1、x、z的精准强度建模方式&#xff0c;这样可以允许将两个线网信号进行线与操作从而更加精确地描述出硬件行…

ACEeditor使用手册(三)

文章目录 ACEeditor使用手册5. 与后端交互5.1 保存与加载文件通过AJAX保存与加载文件与后端框架的集成文件状态同步与冲突解决 5.2 协同编辑与实时同步协同编辑的实现原理WebSocket与实时同步技术协同编辑冲突解决策略 6. ACEeditor常见问题与解决方案6.1 编辑器兼容性问题浏览…

接口的返回值中所需信息作为其他接口入参使用(postman与jmeter的使用)

一、背景&#xff1a; 偶尔会用到一个场景&#xff0c;两个接口之前的调用有依赖关系&#xff0c;将其中一个的返回参数中的部分信息取出来作为入参在第二个接口中使用&#xff0c;代码内是比较好实现&#xff0c;只要定义一个变量&#xff0c;用于参数传递。 如果是测试过程中…

idea带的maven在SpringBoot下载jar包出错

找到idea安装目录 /IntelliJ IDEA/plugins/maven/lib/maven3/conf/settings.xml 搜索:mirrors 添加到mirrors标签里 <mirrors><mirror><id>central</id><mirrorOf>central</mirrorOf><url>https://maven.aliyun.com/repository/publ…

令牌桶算法与Guava的实现RateLimiter源码分析

令牌桶算法与Guava的实现RateLimiter源码分析 令牌桶RateLimiter简介RateLimiter使用示例导入maven依赖编写测试代码 RateLimiter的实现源码解析SmoothRateLimiterSmoothBursty恒速获取令牌acquire(int)tryAcquire(int,long,TimeUnit) 存量桶系数小结 优缺点与漏桶的区别总结 令…

Ontrack EasyRecovery2024恢复软件最新版本有哪些新功能特色?

Ontrack EasyRecovery 16是由Ontrack官方最新出品的一款全面的自助数据恢复软件&#xff0c;中文名称叫做&#xff1a;易恢复。它能够轻松恢复所有的文件类型&#xff0c;包括文档、表格、图片、音视频和其他文件等&#xff0c;支持恢复不同存储介质数据&#xff1a;硬盘、光盘…

关于C#中的LINQ的延迟执行

简介 Linq中的绝大多数查询运算符都有延迟执行的特性,查询并不是在查询创建的时候执行,而是在遍历的时候执行 实例&#xff1a; public void Test2(){List<int> items new List<int>() { -1, 1, 3, 5 };IEnumerable<int> items2 items.Where(x > x &g…

java数据结构与算法刷题-----LeetCode209. 长度最小的子数组

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 解题思路 代码:时间复杂度O(n).空间复杂度O(1) class Solution {public in…

完美实现校验:利用Spring Validation实现强大的输入验证

概述 校验例子 大家平时编码中经常涉及参数的校验&#xff0c;对于一个用户注册的方法来说会校验用户名密码信息&#xff1a; public class UserController {public ResponseEntity<String> registerUser(String username, String password) {if (username null || u…

Python 之 enumerate

enumerate 是一个内置函数&#xff0c;它允许你在遍历一个序列&#xff08;例如一个列表&#xff09;时&#xff0c;同时获取元素的索引和值。 以下是一个使用 enumerate 的例子&#xff1a; fruits [apple, banana, mango] for i, fruit in enumerate(fruits):print(f"E…

UG NX二次开发(C#)-机械管线布置-添加管道路径

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、UG NX中创建线性路径的操作3、采用UG NX二次开发创建线性管线3.1 构建管线上点的数据结构3.2 创建一个链表3.3 创建线性管线的方法3.4 测试结果1、前言 机械管道布局是UG NX的一个应用模…

uniapp、vue、小程序、js图片转base64 示例代码

uniapp是一款跨平台的应用开发框架&#xff0c;基于Vue.js和小程序原生能力进行封装&#xff0c;旨在帮助开发者快速构建跨平台的应用程序。在uniapp中&#xff0c;可以使用Vue.js语法进行页面开发&#xff0c;同时通过使用小程序原生能力&#xff0c;可以实现调用设备的摄像头…

GCC 安装编译linux

1.下载gcc源码 2.配置编译源码 3.安装 下载地址:GCC mirror sites - GNU Project France (no snapshots): ftp.lip6.fr, thanks to ftpmaintlip6.frFrance, Brittany: ftp.irisa.fr, thanks to ftpmaintirisa.frGermany, Berlin: ftp.fu-berlin.de, thanks to ftpfu-berlin…

【数据结构与算法】1.时间复杂度和空间复杂度

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有限&#xff0c;欢迎各位大佬指点&…

二进制数据传输中错误的检测与修正

1 文章问题概述 在二进制传输中&#xff0c;由于各种原因&#xff08;如电磁干扰、硬件故障等&#xff09;&#xff0c;数据位可能会发生变化&#xff0c;导致“1”变成“0”&#xff0c;或者“0”变成“1”&#xff0c;这就是所谓的传输错误。 1.1 如何检测错误 一般通过在发…

【论文阅读】GPT4Graph: Can Large Language Models Understand Graph Structured Data?

文章目录 0、基本介绍1、研究动机2、准备2.1、图挖掘任务2.2、图描述语言&#xff08;GDL&#xff09; 3、使用LLM进行图理解流程3.1、手动提示3.2、自提示 4、图理解基准4.1、结构理解任务4.1、语义理解任务 5、数据搜集5.1、结构理解任务5.2、语义理解任务 6、实验6.1、实验设…

史上最全EasyExcel

一、EasyExcel介绍 1、数据导入&#xff1a;减轻录入工作量 2、数据导出&#xff1a;统计信息归档 3、数据传输&#xff1a;异构系统之间数据传输 二、EasyExcel特点 Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题就是非常的耗内…

以后要做GIS开发的话是学GIS专业还是学计算机专业好一些?

GIS开发其实严格来说分为前后端以及底层开发。不同的方向&#xff0c;代表了不同的开发语言。 所以大家首先要了解自己具体要做的岗位类型是什么&#xff0c;其次才是选择专业侧重点。 但是严格来说&#xff0c;选择某个专业&#xff0c;到就业方向这个过程&#xff0c;并不是…

el-table样式错乱解决方案

bug&#xff1a; 图片的椭圆框住的地方&#xff0c;在页面放大缩小之后就对不齐了。 原因&#xff1a; 主要原因是当你对页面放大缩小的时候&#xff0c;页面进行了重构&#xff0c;页面的宽高及样式进行了变化&#xff0c;但是在这个更新的过程中&#xff0c;table的反应并没…

Redis: Redis介绍

文章目录 一、redis介绍二、通用的命令三、数据结构1、字符串类型&#xff08;String&#xff09;&#xff08;1&#xff09;介绍&#xff08;2&#xff09;常用命令&#xff08;3&#xff09;数据结构 2、列表&#xff08;List&#xff09;&#xff08;1&#xff09;介绍&…