01背包思路解析+代码

news2024/9/28 5:30:47

01背包

题目链接:01背包

在这里插入图片描述

在这里插入图片描述

思路:题目要求是获取背包能装的最大重量。一个物品有体积和重量两个属性。而当我们判断一个物品是否要放进背包,第一取决于他的体积是否足以放进背包,第二取决于他的重量是否足以让我们取出已经放入的一部分物品,再放入该物品。所以我们要保存放入该物品之前的状态,于是我们想到可以使用动态规划。


因为物品有两个属性,我们可以使用二维数组F(i,j)记录。
状态:F(i,j):前i个物品放入大小为j的背包中获得的最大重量(将体积为V的背包分治成1~V大小的背包
状态转移方程:
对于第i个物品,和1~V的体积的背包,有两种情况:

  1. 当前j体积的背包不足以放入第i个物品,那么F(i,j)=F(i-1,j),即不放入
  2. 当前j体积的背包可以放入第i个物品,那么此时有两个选择,放与不放

:需要腾出足够的空间放入,F(i,j)=F(i-1,j - vw[i][0])+vw[i][1]
PS:j - vw[i][0]代表腾出足够空间,+vw[i][1]代表放入该物品,要加上重量

不放:F(i,j)=F(i-1,j)

最后取两个选择中,重量较大的那个
F(i,j)=max(F(i-1,j - vw[i][0]) + vw[i][1],F(i-1,j) )

图片来自牛客题解:摸鱼学大师

第0行和第0列初始化为1

在这里插入图片描述

代码如下:

int knapsack(int V, int n, vector<vector<int> >& vw)
{
    vector<vector<int>> dp(n+1,vector<int>(V+1,0));
    //i和j都从1开始访问,并且要访问到最后一个商品和背包的最大容量
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=V;++j)
        {
            //容量足够
            //i=1代表第一个商品,但对于vw的第0行
            if(vw[i-1][0]<=j)
               dp[i][j]=max(dp[i-1][j],dp[i-1][j-vw[i-1][0]]+vw[i-1][1]);
            else
               dp[i][j]=dp[i-1][j];
        }
    }

    return dp[n][V];
}

在实际运行过程中,我们发现,二维数组其实每次只会用到当前行的上一行,所以我们可以用一维数组代替。
但是在递推时,更新应该从右往左,才不会提前覆盖上一行的数据

int knapsack(int V, int n, vector<vector<int> >& vw) {
        //一维数组
        //因为每次更新只需要用到上一行
        //所以我们可以使用一维数组记录上一行,然后从右往左更新
        vector<int> dp(V+1,0);

        for(int i=1;i<=n;++i)
        {
            for(int j=V;j>0;--j)
            {
                if(vw[i-1][0]<=j)
                    dp[j]=max(dp[j],dp[j-vw[i-1][0]]+vw[i-1][1]);
            }
        }

        return dp[V];
    }

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

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

相关文章

buuctf 你有没有好好看网课? 解析

打开文件得到两个压缩包&#xff0c;第一个压缩包flag2需要密码&#xff0c;第二个压缩包flag3打开后在备注可以获得提示 使用arc爆破&#xff0c;得到6位数字密码 解压压缩包得到一个视频和文档 文档内容包含6个数字&#xff0c;结合视频猜测是关键信息藏在这两个时间节点上 …

XSS注入——DOM型XSS

DOM型xss XSS根据恶意脚本的传递方式可以分为3种&#xff0c;分别为反射型、存储型、DOM型&#xff0c;前面两种恶意脚本都会经过服务器端然后返回给客户端&#xff0c;相对DOM型来说比较好检测与防御&#xff0c;而DOM型不用将恶意脚本传输到服务器在返回客户端&#xff0c;这…

如何优化Nginx服务进程(详细教程)

目录 一、了解Nginx服务配置内容 ① 外框架 ② 内框架 ③ 三个主模块 二、Nginx服务进程 访问信息的组成 Web服务的监听配置 LNMP架构 三、Nginx优化 隐藏版本号 可以查询指定地址的服务信息 更改配置文件内容 检查语法错误 重启服务 再次查看版本号是否隐藏 自…

【qiankun】前端微服务踩坑记录-长期更新

目录 前言 1.Cannot GET /cooperation/board 场景&#xff1a; 分析 解决 2.Invalid options in vue.config.js:"css.requireModuleExtension" is not allowed 原因 解决 3.less版本升级导致除法写法未转换 原因 解决 4.主子应用样式隔离 场景 解决 5…

Java进阶必读书单及博客

java基础 Java核心技术 卷I:开发基础&#xff08;原书第12版&#xff09; Java核心技术 卷II:高级特性&#xff08;原书第12版&#xff09; JVM 《深入理解Java虚拟机&#xff08;第3版&#xff09;》 并发 《Java并发编程实战》 《Java并发编程的艺术》 数据库 《MySQL技术…

win下安装Nginx

安装Nginx 前言 本文演示win11下安装Nginx-1.24.0。本文旨在记录安装流程以及梳理安装配置过程中的一些容易出错的地方。 目录 文章目录 前言目录下载Nginx安装包配置环境变量配置Nginx设置报错日志路径设置Nginx的启动端口号 启动Nginx 下载Nginx安装包 前往Nginx官方下载…

FineReport学习1

聚合报表是指将多个子报表数据进行集中汇总、分析和呈现的报表&#xff0c;通常用于展示公司的整体数据情况。聚合报表可以帮助管理人员和决策者更全面、准确地了解公司在不同维度上的业务情况&#xff0c;便于对公司业务进行分析和决策。 决策报表则是指根据决策需求构建的针…

性能测试——银行核心业务系统性能测试

目录 前言&#xff1a; 测试内容 测试方法 注意事项 总结&#xff1a; 前言&#xff1a; 本文讨论的是基于字符终端型的银行核心业务系统。银行核心业务系统由于其复杂的业务流程&#xff0c;以及特殊的终端字符形式&#xff0c;与一般的B/S结构、C/S结构系统有较大的差异&am…

Vue3新特性全预览

目录 自定义Hook函数 介绍 示例 toRef和toRefs 介绍 代码示例 shallowReactive和shallowRef(不常用只做了解) readonly与shallowReadonly(不常用只做了解) toRaw与markRaw(不太常用只做了解) provide与inject 介绍 代码示例 ​编辑 响应式数据的判断 Composition Api的…

QML Canvas 元素(渐变和阴影)

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 经过前面的 Canvas 学习,我们可以很容易地使用 strokeStyle 和 fillStyle 来设置图形的边框色和填充色,例如:“green”、“black” 等。其实除了使用纯色之外,我们还可以使用一些渐变色,如果你想让图形…

基于matlab使用卡尔曼滤波器进行对象跟踪(附源码)

一、前言 此示例演示如何使用对象和函数来跟踪对象。 二、介绍 卡尔曼滤波器有许多用途&#xff0c;包括控制、导航、计算机视觉和时间序列计量经济学方面的应用。此示例说明了如何使用卡尔曼滤波器跟踪对象&#xff0c;并重点介绍三个重要功能&#xff1a; 预测物体的未来位置…

基于条件风险价值CVaR的微网动态定价与调度策略(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

人工智能(pytorch)搭建模型14-pytorch搭建Siamese Network模型(孪生网络),实现模型的训练与预测

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能(pytorch)搭建模型14-pytorch搭建Siamese Network模型(孪生网络)&#xff0c;实现模型的训练与预测。孪生网络是一种用于度量学习&#xff08;Metric Learning&#xff09;和比较学习&#xff08;Compariso…

教学实训模块升级,助力应用型数据科学人才培养|ModelWhale 版本更新

初夏梅雨季&#xff0c;ModelWhale 迎来新一轮版本更新&#xff0c;多角度优化各领域用户的使用体验。 本次更新中&#xff0c;ModelWhale 主要进行了以下功能迭代&#xff1a; • 优化 课程作业布置&#xff08;团队版✓ &#xff09; • 新增 课程作业关联至课件&#xff…

MySQL的服务层和存储引擎层

1. 服务层&#xff08;Server Layer&#xff09;&#xff1a; 服务层是MySQL的顶层组件&#xff0c;负责处理客户端与MySQL服务器之间的交互。它提供了一组API和协议&#xff0c;使应用程序能够连接到MySQL服务器&#xff0c;并发送查询、事务管理、用户权限控制等请求。服务层…

6-js基础-1

JavaScript 基础 - 1 了解变量、数据类型、运算符等基础概念&#xff0c;能够实现数据类型的转换&#xff0c;结合四则运算体会如何编程。 JavaScript介绍变量常量数据类型运算符实战案例 重点单词&#xff1a; js介绍 能说出JavaScript 是什么? 怎么写? 能写出JavaScript 输…

【C++详解】——红黑树

目录 红黑树的概念 红黑树的性质 红黑树节点的定义 红黑树的结构 红黑树的插入操作 情况一 情况二 情况三 红黑树的验证 红黑树的查找 红黑树与AVL树的比较 红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示…

基于SpringBoot的在线拍卖系统【附ppt和万字文档(Lun文)和搭建文档】

主要功能 主要功能 前台登录&#xff1a; ①首页&#xff1a;轮播图、竞拍公告、拍卖商品展示 ②拍卖商品&#xff1a;分类&#xff1a;手机、数码、电器等&#xff0c;可以点击商品竞拍 ③竞拍公告&#xff1a;可以查看竞拍的信息 ④留言反馈&#xff1a;用户可以提交留言 ⑤…

如何办理跨境电商营业执照?加速度jsudo

如今电商行业的发展持续火热&#xff0c;跨境电商亦是如此&#xff0c;随着疫情的好转&#xff0c;各行各业也逐渐好转起来&#xff0c;此时也是一个做跨境电商的好时机&#xff0c;那么做跨境电商的前提需要什么呢?当然是营业执照了&#xff0c;那么如何办理跨境电商营业执照…

Flutter Ping 检查服务器通讯信号强度

Flutter Ping 检查服务器通讯信号强度 前言 对通讯敏感的程序中&#xff0c;我们除了检查当前网络通道外&#xff0c;还要检查与服务器实际的型号强度。 一般我们采用 ping 的方式返回型号的强度和稳定程度。 dart_ping 包 https://pub-web.flutter-io.cn/packages/dart_ping …