My Sixty-seventh Page - 0-1背包问题理论 - By Nicolas

news2024/11/27 18:36:39

小尼在这里跟大家说明一下0-1背包问题的理论,首先我们需要认识一下什么是背包问题。小尼在这里拉一下代码随想录的代码,有兴趣的小伙伴也想把背包问题学好,可以去代码随想录看一看背包问题的讲解,也可以去B站看一看代码随想录对背包问题的讲解:
416.分割等和子集1

有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。

动态规划-背包问题

这是标准的背包问题,以至于很多同学看了这个自然就会想到背包,甚至都不知道暴力的解法应该怎么解了。

这样其实是没有从底向上去思考,而是习惯性想到了背包,那么暴力的解法应该是怎么样的呢?

每一件物品其实只有两个状态,取或者不取,所以可以使用回溯法搜索出所有的情况,那么时间复杂度就是$o(2^n)$,这里的n表示物品数量。

所以暴力的解法是指数级别的时间复杂度。进而才需要动态规划的解法来进行优化!

我们既然将背包问题当成动态规划的问题进行对应的求解,那么我们就一定存在递归五部曲,小尼一一说明一下这五部的进行,首先第一步:确定dp数组以及下标的含义

对于背包问题,我们先讲第一种写法,就是利用二维数组,即dp[i][j]表示从下表为[0-i]的物品里面任意取,放进容量为j的背包里面,价值总和的最大是多少,所以小伙伴一定要搞清楚,dp在这里表示的是价值的多少,也就是在i,j同时满足的条件下得到的价值的最优解

第二步:递推公式

我们回顾一下dp数组的含义,就是从下标为[0-i]的物品里面任意取,放进容量为j的背包,价值总和最大时多少,我们先需要分析放入的情况:

1、我们不放入物品:由dp[i-1][j]推出,即背包容量为j,里面不放入物品i的最大价值,此时dp[i][j]就是dp[i-1][j]。(其实就是当物品i的重量大于背包j的重量时,物品i无法放入背包中,所以背包内的价值依然和前面的相同)

2、我们放入物品:由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] = max(dp[i-1][j], dp[]i-1[j-weight[i]] + value[i])

第三步:对dp数组进行初始化

首先我们从dp[i][j]的定义出发,如果背包容量j为0的话,即dp[i][0],无论是选取哪些物品,背包价值总和一定为0。对于小尼所说的上述的二维数组的情况也只需要给出这一个初始化就可以了。

第四步:确定遍历顺序

在本层的条件下,我们无论是从物品的角度进行遍历或者是从背包容量的大小进行遍历都是可以的。小尼接下来就给出先遍历物品,然后遍历背包重量的代码:

// weight数组的大小 就是物品个数
for(int i = 1; i < weight.size(); i++) { // 遍历物品
    for(int j = 0; j <= bagweight; j++) { // 遍历背包容量
        if (j < weight[i]) dp[i][j] = dp[i - 1][j]; 
        else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);

    }
}

小尼接下来再给出先遍历背包,再遍历物品的代码:

// weight数组的大小 就是物品个数
for(int j = 0; j <= bagweight; j++) { // 遍历背包容量
    for(int i = 1; i < weight.size(); i++) { // 遍历物品
        if (j < weight[i]) dp[i][j] = dp[i - 1][j];
        else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
    }
}

第五步:导出背包放入的顺序

最后我们只需要导出顺序即可

小尼接下来给出一段一个背包的完整的代码:

public static void main(String[] args) {
        int[] weight = {1, 3, 4};
        int[] value = {15, 20, 30};
        int bagsize = 4;
        testweightbagproblem(weight, value, bagsize);
    }

    public static void testweightbagproblem(int[] weight, int[] value, int bagsize){
        int wlen = weight.length, value0 = 0;
        //定义dp数组:dp[i][j]表示背包容量为j时,前i个物品能获得的最大价值
        int[][] dp = new int[wlen + 1][bagsize + 1];
        //初始化:背包容量为0时,能获得的价值都为0
        for (int i = 0; i <= wlen; i++){
            dp[i][0] = value0;
        }
        //遍历顺序:先遍历物品,再遍历背包容量
        for (int i = 1; i <= wlen; i++){
            for (int j = 1; j <= bagsize; j++){
                if (j < weight[i - 1]){
                    dp[i][j] = dp[i - 1][j];
                }else{
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i - 1]] + value[i - 1]);
                }
            }
        }
        //打印dp数组
        for (int i = 0; i <= wlen; i++){
            for (int j = 0; j <= bagsize; j++){
                System.out.print(dp[i][j] + " ");
            }
            System.out.print("\n");
        }
    }

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

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

相关文章

java项目-第158期ssm仓库智能仓储系统_java毕业设计_计算机毕业设计

java项目-第158期ssm仓库智能仓储系统_java毕业设计_计算机毕业设计 今天分享的项目是《ssm仓库智能仓储系统》 该项目分为3个角色&#xff0c;管理员、员工、供应商。 员工角色登录后台&#xff0c;主要负责流水线工作&#xff0c;比如&#xff1a;查看供应商、 货物采购管理…

【计算机视觉OpenCV基础】实验一 图像预处理

实验一 图像预处理 计算机视觉OpenCV基础实验合辑&#xff08;实验1234扩展&#xff09; 资源下载地址&#xff1a; https://download.csdn.net/download/weixin_53403301 合辑&#xff1a;&#xff08;加在下载地址后面&#xff09; /87113581 讲义&#xff08;包括理论、图例…

MCE | 分子伴侣介导的自噬

自噬是细胞在外界环境因素的影响下&#xff0c;利用溶酶体&#xff0c;降解自身受损、变性大分子物质或者细胞器的自我消化过程。依据其发生途径&#xff0c;主要分为三种&#xff1a;巨自噬 (Macroautophagy)&#xff0c;微自噬 (Microautophagy) 和分子伴侣介导的自噬 (Chape…

MyBatis 缓存机制

文章目录一、一级缓存二、二级缓存1.cache 元素2.缓存命中率一、一级缓存 MyBatis 的一级缓存是 SqlSession 级别的缓存。如果同一个 SqlSession 对象多次执行完全相同的 SQL 语句&#xff0c;在第一次执行完成后&#xff0c;MyBatis 会将查询结果写入一级缓存中&#xff0c;此…

mysql中的binlog用法

binlog是什么 MySQL的二进制日志binlog可以说是MySQL最重要的日志&#xff0c;它记录了所有的DDL和DML语句&#xff08;除了数据查询语句select&#xff09;,以事件形式记录&#xff0c;还包含语句所执行的消耗的时间&#xff0c;MySQL的二进制日志是事务安全型的。使用mysqlb…

Kotlin语法学习(四)_空指针检查

空指针检查 空指针异常是一种不受编程语言检查的运行时异常,只能由程序员主动通过逻辑判断来避免,所以空指针异常往往比较容易出这个问题 可空类型系统 在Kotlin当中利用了编译时判空检查的机制几乎杜绝了空指针异常,Kotlin提供了一些列的工具,让我们能够轻松处理各种判空情…

Verilog 随机数及概率分布

随机数 Verilog 中使用系统任务 $random(seed) 产生随机数&#xff0c;seed 为随机数种子。seed 值不同&#xff0c;产生的随机数也不同。如果 seed 相同&#xff0c;产生的随机数也是一样的。可以为 seed 赋初值&#xff0c;也可以忽略 seed 选项&#xff0c;seed 默认初始值为…

130. 被围绕的区域

130. 被围绕的区域 给你一个 m∗nm * nm∗n 的矩阵 board &#xff0c;由若干字符 ‘X’ 和 ‘O’ &#xff0c;找到所有被 ‘X’ 围绕的区域&#xff0c;并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。 实例1&#xff1a; 输入&#xff1a;board [[“X”,“X”,“X”,“X”],…

内容云筑底,火山引擎能否为企业添一把火?

在App里面再搭一个“今日头条”&#xff0c;让用户在自家的App里看图文、刷视频&#xff0c;这是很多企业都想干的一件事情。尤其是对于用户使用频率低的App而言&#xff0c;他们更需要依靠信息流内容加长用户停留时间&#xff0c;增加用户互动次数&#xff0c;进而留住用户&am…

神经网络和深度学习-梯度下降Gradient Descent

梯度下降 损失函数 绝大多数的机器学习模型都会有一个损失函数。比如常见的均方误差&#xff08;Mean Squared Error)损失函数&#xff1a; L(w,b)1N∑i1N(yi−f(wxib))2L(w, b)\frac{1}{N} \sum_{i1}^{N}\left(y_{i}-f\left(w x_{i}b\right)\right)^{2} L(w,b)N1​i1∑N​(y…

物理层物理层

该层解决具体比特传输问题 一般的数据通信系统如图&#xff1a; 该系统可按通信方式分为两种&#xff1a;同步/异步通信和模拟/数字通信&#xff1a; 异步通信是通信双方各自时钟独立&#xff0c;每次只传输一个字符&#xff0c;时钟在传送开始时对齐&#xff1b;这种机制简单…

[附源码]计算机毕业设计JAVA驾校管理系统

[附源码]计算机毕业设计JAVA驾校管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis M…

Docker(四):Docker可视化管理工具

背景 在技术这一行&#xff0c;学无止境&#xff0c;无数的知识点在大脑里面堆积着。各种命令行脚本&#xff08;Python,Java,Nodejs,Linux,Docker&#xff09;数不胜数&#xff0c;如果有视图化的管理工具&#xff0c;帮我们管理着这些命令行脚本&#xff0c;岂不美哉。可以节…

11.22Spring 学习day02

1. 1.1 XML和注解的区别 xml优点&#xff1a; 把标签配置和java代码解耦一目了然&#xff0c;对于业务量大的需求&#xff0c;可以清晰表明各个对象的关系 缺点&#xff1a; 配置不方便&#xff0c;读取和解析需要一定的时间无法及时校验正确性 注解优点&#xff1a; 配置…

返乡人员信息登记管理系统,助力精准管控

随着全国疫情的零星化&#xff0c;再加上元旦与春节很快就要来临了。这几个月各省的人员流动性肯定会逐渐增加&#xff0c;为了应对佳节的人流高峰期&#xff0c;不少省市都早已发出通知。要求返乡人员提前3天提前报备行程&#xff0c;从而便于极大地提高了登记效率&#xff0c…

数字集成电路设计(五、仿真验证与 Testbench 编写)(四)

文章目录7. 用户自定义元件模型7.1 UDP应用实例8. 基本门级元件和模块的延时建模8.1 门级延迟建模8.1.1 门级延迟的基本延迟表达形式8.1.2 门级延迟的最小、典型、最大延迟表达形式8.1.3 例子用VerilogHDL建立图5.8-1 模块D的延迟仿真模块8.2 模块延迟建模8.2.1 延迟说明块 Spe…

数据分析和可视化必备的几大软件,你用过几个?

本文主要是面向数据分析初学者&#xff0c;因此分享的基本是一些免编程的可视化工具&#xff0c;详细介绍了7款工具&#xff0c;推荐大家使用&#xff0c;主要是让初学数据分析的朋友知道可视化工具大概有哪些、流行的有哪些。 Power BI Power BI是微软开发的商业分析工具。用户…

LeetCode 91 双周赛

2465. 不同的平均值数目 给你一个下标从 0 开始长度为 偶数 的整数数组 nums 。 只要 nums 不是 空数组&#xff0c;你就重复执行以下步骤&#xff1a; 找到 nums 中的最小值&#xff0c;并删除它。找到 nums 中的最大值&#xff0c;并删除它。计算删除两数的平均值。 两数…

mysql InnooDb存储引擎的体系结构和逻辑存储结构

前言 这是一篇理论性比较强的文章&#xff0c;是不是很多人一听理论性的东西&#xff0c;就被劝退了&#xff1f;可千万别。其实分享内容非常简单&#xff0c;也非常干&#xff0c;相信你会喜欢的&#xff0c;对你也是有帮助的。切入正题&#xff0c;mysql的体系结构可以作为一…

机理类模型的建模思路|2021年亚太赛B题|2022备赛|前景目标提取

目录 一、 前景目标提取问题 1.背景目标和前景目标提取 2.问题一 2.2问题一求解 3.问题二 4.问题三 5.问题四 6.问题五​ 7.问题六 8.矩阵范数 二、前景目标提取——机理总结 三、编程实现 一、 前景目标提取问题 1.背景目标和前景目标提取 不动 & 动 视…