【动态规划】【背包问题】基础背包

【动态规划】【01背包问题】

    • 解法 二维dp数组01背包
    • 解法 一维dp数组(滚动数组)01背包

---------------🎈🎈题目链接🎈🎈-------------------

解法 二维dp数组01背包

😒: 我的代码实现============>

动规五部曲

✒️确定dp数组以及下标的含义

dp[i][j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少

✒️确定递推公式

不放物品i:由dp[i - 1][j]推出,即背包容量为j,里面不放物品i的最大价值,此时dp[i][j]就是dp[i - 1][j]。(其实就是当物品i的重量大于背包j的重量时,物品i无法放进背包中,所以背包内的价值依然和前面相同。)
放物品i:由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数组初始化

空间为0时,所有物品都放不进去,价值都为0
物品0的重量超过书包重量时,放不进去,价值为0。超过后就可以放入,此时价值为物品0的价值,value[0]

✒️确定遍历顺序

先遍历背包和先遍历物品都可以

✒️举例推导dp数组

在这里插入图片描述

时间复杂度O(N)
空间复杂度O(N)

📘代码

import java.util.*;

public class Main{
    public static void main (String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        int goodscount = scanner.nextInt(); //物品个数
        int bagsize = scanner.nextInt(); //书包大小
        int[] space = new int[goodscount];
        int[] value = new int[goodscount];
             
        scanner.nextLine();
        for(int i = 0; i < goodscount ; i++){
            space[i] = scanner.nextInt();
        }
        scanner.nextLine();
        for(int j = 0; j < goodscount ; j++){
            value[j] = scanner.nextInt();
        }
          
        
        // dp[i][j]:代表0-i号物品 放到j大小的背包中 的最大价值
        int[][] dp = new int[goodscount][bagsize+1];
        
        //初始化dp数组 
        // 背包重量为0的时候,所有物品对应的价值均为0
        for(int i = 0; i < goodscount; i++){
            dp[i][0] = 0;
        }
        //物品0:只有在其重量小于等于背包容量 bagsize 时,对应的dp[i][j]才等于其价值value[0],否则就都是0
        for(int i = space[0]; i <= bagsize; i++){
            dp[0][i] = value[0];
        }
        
        
        // 递推表达式:dp[i][j] = max( dp[i-1][j] , dp[i-1][j-weight[i]] + value[i] )
        for(int i = 1; i < goodscount; i++){
            for(int j = 1; j <= bagsize; j++){
                if(j<space[i]){
                	// 当当前书包容量小于物品i重量space[i]时 就放不进去 
                	// 那么前i-1个物品能放下的最大价值就是当前情况的最大价值
                    dp[i][j] = dp[i-1][j];
                }
                else{
                	// 当前背包的容量可以放下物品i,那么此时分两种情况:
                	// 1、不放物品i
                    // 2、放物品i
                    // 比较这两种情况下,哪种背包中物品的最大价值最大
                    dp[i][j] = Math.max( dp[i-1][j] , dp[i-1][j-space[i]] + value[i] );
                }
                
            }
        }
        
       System.out.println(dp[goodscount-1][bagsize]);
        
    }
}    

解法 一维dp数组(滚动数组)01背包

😒: 我的代码实现============>

动规五部曲

✒️确定dp数组以及下标的含义

dp[j]表示:容量为j的背包,所背的物品价值可以最大为dp[j]。

✒️确定递推公式

不放物品i:dp[j]
放物品i:dp[j - weight[i]] + value[i]
所以递归公式: dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);

✒️dp数组初始化

空间为0时,所有物品都放不进去,值都为0:dp[0] = 0
其他下初始化:dp数组在推导的时候一定是取价值最大的数,如果题目给的价值都是正整数那么非0下标都初始化为0就可以了。

✒️确定遍历顺序

正向遍历物品
反向遍历背包容量

✒️举例推导dp数组

在这里插入图片描述

📘代码

package ACM;

import java.util.*;

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

    public static void testWeightBagProblem(int[] weight, int[] value, int bagWeight){
        // 【dp[j]:代表背包容量为j时候 能获得的最大价值】
        int[] dp = new int[bagWeight+1];

        //【初始化dp数组】
        // 背包重量为0的时候,价值为0,其余初始化均为0
        dp[0] = 0;


        // 二维递推表达式:dp[i][j] = max( dp[i-1][j] , dp[i-1][j-weight[i]] + value[i] )
        // 一维滚动数组:dp[j] = max( dp[j], dp[j-weight[i]]+value[i] )
        // 【遍历顺序:正序遍历物品i + 倒序遍历背包容量j】
        // 用物品0遍历背包  0 15 15 15 15
            // 物品0,背包容量为bagWight=4时,能获得的最大价值   dp[4] = max(不放物品0:0, 放物品0:dp[4-weight[0]] + value[0])   = 15
            // 物品0,背包容量为3时,能获得的最大价值 15  dp[3] = max(0, dp[3-weight[0]] + value[0])   = 15
            // 物品0,背包容量为2时,能获得的最大价值 15  dp[2] = max(0, dp[2-weight[0]] + value[0])   = 15
            // 物品0,背包容量为1时,能获得的最大价值 15  dp[1] = max(0, dp[1-weight[0]] + value[0])   = 15
            // 物品0,背包容量为0时,能获得的最大价值 0   0
        // 用物品1遍历背包 0 15 15 20 35
            // 物品1,背包容量为bagWight=4时,能获得的最大价值   dp[4] = max(dp[4], dp[4-weight[1]] + value[1])  = max(15, 15+20)  = 35
            // 物品1,背包容量为3时,能获得的最大价值 15  dp[3] = max(dp[3], dp[3-weight[1]] + value[1])  = max(15, 0+20)  = 20
            // 物品1,背包容量为2时,能获得的最大价值 15  dp[2] = max(dp[2], 物品1放不下:0)  = max(15, 0)  = 15
            // 物品1,背包容量为1时,能获得的最大价值 15  dp[1] = max(dp[1], 物品1放不下:0)  = max(15, 0)  = 15
            // 物品1,背包容量为0时,能获得的最大价值 0   0
        // 用物品2遍历背包
        // ...
        // 物品weight.length-1

        for(int i = 0; i < weight.length; i++){ // 正向遍历物品i
            for(int j = bagWeight; j >= weight[i]; j--){ // 反向遍历背包容量j
                dp[j] = Math.max(dp[j] , dp[j-weight[i]]+value[i]);
            }
        }

        //打印dp数组
        for (int j = 0; j <= bagWeight; j++){
            System.out.print(dp[j] + " ");
        }
    }
} 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

操作系统导论课后作业-第十七章答案

课程作业-第十七章&#xff1a; 17.1首先以标志flag -n 10 -H 0 -p BEST -s 0运行程序来产生一些随机的分配和空闲。你能预测malloc()/free()会返回什么吗&#xff1f;你可以在每次请求后猜测空闲列表的状态吗&#xff1f;随着时间的推移&#xff0c;你对空闲列表有什么发现&a…

2012年认证杯SPSSPRO杯数学建模C题(第一阶段)碎片化趋势下的奥运会商业模式全过程文档及程序

2012年认证杯SPSSPRO杯数学建模 C题 碎片化趋势下的奥运会商业模式 原题再现&#xff1a; 从 1984 年的美国洛杉矶奥运会开始&#xff0c;奥运会就不在成为一个“非卖品”&#xff0c;它在向观众诠释更高更快更强的体育精神的同时&#xff0c;也在攫取着巨大的商业价值&#…

CSS3新增的语法(四)

CSS3新增的语法&#xff08;四&#xff09;【布局】 14. 多列布局15.伸缩盒模型1. 伸缩盒模型简介2. 伸缩容器、伸缩项目3. 主轴与侧轴4. 主轴方向5. 主轴换行方式6. flex-flow7. 主轴对齐方式8. 侧轴对齐方式8.1 一行的情况8.2 多行的情况 9.flex 实现水平垂直居中10. 伸缩性1…

Java异常入门

目录 前言 异常 什么是异常 异常&#xff08;Exception&#xff09;和错误&#xff08;Error&#xff09; 异常的处理 异常的作用 前言 我们用一个简单情形引入异常&#xff1a; class Devide{public int divide(int a ,int b ){return a / b ;} }public class Main{pu…

PDF编辑和格式转换工具 Cisdem PDFMaster for Mac

Cisdem PDFMaster for Mac是一款功能强大的PDF编辑和格式转换工具。它为用户提供了直观且易于使用的界面&#xff0c;使常用功能触手可及&#xff0c;从而帮助用户轻松管理、编辑和转换PDF文件。 软件下载&#xff1a;Cisdem PDFMaster for Mac v6.0.0激活版下载 作为一款完整的…

excel统计分析——协方差分析的作用

参考资料&#xff1a;生物统计学 1、协变量与试验因素的区别 如果把协方差分析资料中的协变量看作多因素方差分析资料中的一个因素&#xff0c;则两类资料有相似之处&#xff0c;但两类资料有本质的不同。在方差分析中&#xff0c;各因素的水平时人为控制的&#xff0c;即使是…

前视声呐目标识别定位(四)-代码解析之启动识别模块

前视声呐目标识别定位&#xff08;一&#xff09;-基础知识 前视声呐目标识别定位&#xff08;二&#xff09;-目标识别定位模块 前视声呐目标识别定位&#xff08;三&#xff09;-部署至机器人 以启动识别模块为例&#xff0c;其余关闭识别模块&#xff0c;启动和关闭声呐…

【管理咨询宝藏48】AA银行信息科技提升分析报告

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏48】AA银行信息科技提升分析报告 【格式】PPT版本&#xff0c;可编辑 【关键词】战略规划、商业分析、管理咨询 【强烈推荐】这是一套市面上非常…

Spark-Scala语言实战(11)

在之前的文章中&#xff0c;我们学习了如何在spark中使用RDD中的cartesian,subtract最终两种方法。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 Spark-Scal…

Prisma ORM 5.12 发布,支持 Cloudflare D1 数据库

昨晚&#xff0c;Prisma ORM 发布了 5.12.0 稳定版本&#xff0c;在此版本中 Prisma ORM 新增了对 Cloudflare D1 的预览支持&#xff0c;现在我们可以选择将本地的 SQLite 数据库逐步迁移到 Cloudflare 上面&#xff0c;从而实现无需额外成本即可构建处理大量用户的应用程序。…

UE4_自定义反射和折射和法线图

UE4 自定义反射和折射和法线图 2020-05-22 09:36 将ReflectionVector和反射图像进行ViewAlignedReflection,输出的textrue和相机位置CameraPosition的onePlus进行Dot点乘之后乘以一个float系数反射度&#xff0c;输出给固有色&#xff0c;就有反射效果了。球型反射。 折射&…

进制转换器(C语言)

目录 1问题&#xff1a; 输入任意进制的数值&#xff0c;可以转换成任意进制的数值&#xff08;2到36进制&#xff09;; 2思路&#xff1a; 3代码&#xff1a;&#xff08;需要运用到数据结构栈的知识&#xff09; 4运行结果&#xff1a; 1问题&#xff1a; 输入任意进制的数…

跨域问题解决方案之CORS

跨域问题解决方案之CORS 文章目录 跨域问题解决方案之CORS概述浏览器的同源策略同源的判定规则目的同源策略的限制范围 浏览器的同源策略为什么会引发跨域问题&#xff1f;CORS规则CORS解决方案CORS方案将请求分为两类举例简单请求预检请求总结学以致用 概述 浏览器安全的基石…

文件操作详解(二)

目录 一.文件的顺序读写1.顺序读写函数&#xff08;适合于所有的流&#xff09;1.1 fgetc(读字符)1.2 fputc(写字符)1.3 fgets(读字符串)1.4 fput(写字符串)1.5 fscanf(格式化地读)1.6 fprintf(格式化地写) 2.顺序读写函数&#xff08;只适用于文件流&#xff09;2.1 fread(二进…

jupyter Notebook 默认路径修改

1. anaconda prompt 中运行 jupyter notebook --generate-config 命令&#xff0c;将在 C:\Users\Think\.jupyter文件下生成 jupyter_notebook_config.py 文件。 2.在jupyter_notebook_config.py 文件中&#xff0c;找c.NotebookApp.notebook_dir 这个变量&#xff0c; (1)若…

2012年认证杯SPSSPRO杯数学建模A题(第二阶段)蜘蛛网全过程文档及程序

2012年认证杯SPSSPRO杯数学建模 A题 蜘蛛网 原题再现&#xff1a; 第二阶段问题   现在我们假设一个具体的环境。假设有一个凸多边形的区域&#xff0c;蜘蛛准备在这个区域&#xff08;或其一部分&#xff09;上结一张网。   问题一&#xff1a; 在区域的边界上安置有若干…

区间概率预测python|QR-CNN-BiLSTM+KDE分位数-卷积-双向长短期记忆神经网络-时间序列区间概率预测+核密度估计

区间预测python|QR-CNN-BiLSTMKDE分位数-卷积-双向长短期记忆神经网络-核密度估计-回归时间序列区间预测 模型输出展示&#xff1a; (图中是只设置了20次迭代的预测结果&#xff0c;宽度较宽&#xff0c;可自行修改迭代参数&#xff0c;获取更窄的预测区间&#xff09; 注&am…

【chrome扩展】简 Tab (SimpTab)‘每日一句名言’样式

背景&#xff1a;最初参考“每日诗词”发现总是那几句&#xff0c;可以更换API接口完成“每日一句名言” 声明&#xff1a;本人不会ajax及ccs样式&#xff0c;非专业人士&#xff0c;借助CHATGPT代码生成完成。请友善交流。 每一句名言API: "https://api.xygeng.cn/open…

焦糖布丁理论:从用户任务角度重新审视产品价值

一、引言&#xff1a; 在竞争激烈的市场环境中&#xff0c;我们经常会遇到这样的困惑&#xff1a;为什么一款自认为极具创新和品质的产品&#xff0c;却未能获得市场的青睐和认可&#xff1f;焦糖布丁理论为我们提供了一个全新的视角&#xff0c;即”客户并非在购买产品本身&a…

gitlab代码迁移,包含历史提交记录、标签、分支

1、克隆现有的GitLab仓库&#xff08;http://localhost:8888/aa/bb/cc.git&#xff09;到本地&#xff0c;包括所有分支和标签 git clone --bare http://localhost:8888/aa/bb/cc.git 2、在gitlab上创建一个空的仓库&#xff08;http://localhost:7777/aa/bb/cc.git&#xff…