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

news2024/10/5 15:23:29

【动态规划】【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] + " ");
        }
    }
} 

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

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

相关文章

RedCap轻量化5G提升生产效率,多领域应用

在工业数字化时代&#xff0c;工业智能化已经成为了各行各业的发展趋势。而在这个过程中&#xff0c;5G作为新一代网络通信技术正逐渐成为工业领域的核心力量。而在5G技术的应用中&#xff0c;RedCap轻量化5G工业网关路由器便是低成本畅享5G的最佳选择。 RedCap轻量化5G工业网…

可视化大屏的应用(18):网络安全和信息安全领域

可视化大屏在物联网领域具有以下价值&#xff1a; 实时监控和可视化&#xff1a; 可视化大屏可以将物联网设备和传感器的数据以图表、图形和动画等形式实时展示&#xff0c;帮助用户直观地了解物联网系统的运行状态和数据趋势。通过可视化大屏&#xff0c;用户可以快速发现异…

说说对排序算法的一些理解

对排序 - 冒泡排序的理解 冒泡排序是一种简单的排序算法&#xff0c;其基本思想是通过多次遍历数组&#xff0c;每次比较相邻的两个元素。如果前一个元素大于后一个元素&#xff0c;则交换它们的位置。这样&#xff0c;每一次遍历都会将当前未排序部分的最大元素“冒泡”到数组…

游戏引擎中的物理应用

一、 角色控制器 Character Controller和普通的动态对象&#xff08;Dynamic Actor &#xff09;是不同的&#xff0c;主要的三个特点是: 它拥有可控制的刚体间的交互假设它是有无穷的摩擦力&#xff08;可以站停在位置上&#xff09;&#xff0c;没有弹性加速和刹车几乎立即…

图论(Graph theory)

抽象数据结构类型 Graphic操作接口 操作接口功能描述操作接口功能描述e()获取图的总边数n()顶点的总数exits(v,u)判断v,u两个顶点是否存在边insert(v) 在顶点集 V 中插入新顶点 v remove(v,u)删除从v 到u的 关联边 remove(v) 将顶点 v 从顶点集中删除 type(v,u)边所属的类型(…

蓝桥杯物联网竞赛_STM32L071_15_ADC/脉冲模块

ADC模块用的是RP1不用多说了&#xff0c;主要是脉冲模块&#xff0c;这个模块没考过 这个脉冲模块放出脉冲&#xff0c;主要能用TIM捕获到这个脉冲的高电平持续时间即可 CubMx配置&#xff1a; 脉冲模块的引脚与PB0相连&#xff0c;所以用PB0读取上升沿记的数和下降沿记的数&am…

【第十一届大唐杯全国大学生新一代信息通信技术大赛】赛题分析

赛道一 一等奖 7% 二等奖 15% 三等奖 25% 赛道二 参考文档&#xff1a; 《第十一届大唐杯全国大学生新一代信息通信技术大赛&#xff08;产教融合5G创新应用设计&#xff09;专项赛说明.pdf》 一等奖&#xff1a;7% 二等奖&#xff1a;10% 三等奖&#xff1a;20% 赛项一&am…

【SQL】1873. 计算特殊奖金(CASE WHEN;IF())

题目描述 leetcode题目&#xff1a;1873. 计算特殊奖金 Code 写法一&#xff1a; CASE WHEN select employee_id, (case when employee_id % 2 0 or name like M% then salary 0 else salary end) as bonus from Employees order by employee_id写法二 &#xff1a;IF() …

大数据毕业设计hadoop+spark旅游推荐系统 旅游可视化系统 地方旅游网站 旅游爬虫 旅游管理系统 计算机毕业设计 机器学习 深度学习 知识图谱

基于hive数据仓库的贵州旅游景点数据分析系统的设计与实现 摘 要 随着旅游业的快速发展和数字化转型&#xff0c;旅游数据的收集和分析变得越来越重要。贵州省作为一个拥有丰富旅游资源的地区&#xff0c;旅游数据的分析对于促进旅游业的发展和提升旅游体验具有重要意义。基…

Docker 部署开源远程桌面工具 RustDesk

RustDesk是一款远程控制&#xff0c;远程协助的开源软件。完美替代TeamViewer &#xff0c;ToDesk&#xff0c;向日葵等平台。关键支持自建服务器&#xff0c;更安全私密远程控制电脑&#xff01;官网地址&#xff1a;https://rustdesk.com/ 环境准备 1、阿里云服务器一 台&a…

Jenkins磁盘空间自动清理

背景介绍 Jenkins作为一款广泛应用于自动化构建、测试与部署的强大工具&#xff0c;在长时间运作后&#xff0c;其服务器上积累了大量的构建历史、工作空间、日志文件以及其他临时数据。每次构建都会生成一系列的工作产物&#xff0c;随着时间的推移&#xff0c;这些数据逐渐占…

RabbitMQ3.x之六_RabbitMQ使用场景

RabbitMQ3.x之六_RabbitMQ使用场景 文章目录 RabbitMQ3.x之六_RabbitMQ使用场景1. 为什么选择 RabbitMQ&#xff1f;1. 可互操作2. 灵活3. 可靠 2. 常见用户案例1. 服务解耦2. 远程过程调用3. 流处理4. 物联网 1. 为什么选择 RabbitMQ&#xff1f; RabbitMQ 是一个可靠且成熟的…

微服务连接不上rabbitmq解决

1.把端口port: 15672改成port&#xff1a;5672 2&#xff1a;virtual-host: my_vhost一定对应上

云计算存在的安全隐患

目录 一、概述 二、ENISA云安全漏洞分析 三、云计算相关系统漏洞 3.1 概述 3.2 漏洞分析 3.2.1 Hypervisor漏洞 3.2.1.1 CVE-2018-16882 3.2.1.2 CVE-2017-17563 3.2.1.3 CVE-2010-1225 3.2.2 虚拟机漏洞 3.2.2.1 CVE-2019-14835 3.2.2.2 CVE-2019-5514 3.2.2.3 CV…

OpenHarmony实战开发-多设备自适应能力

介绍 本示例是《一次开发&#xff0c;多端部署》的配套示例代码&#xff0c;展示了页面开发的一多能力&#xff0c;包括自适应布局、响应式布局、典型布局场景以及资源文件使用。 说明&#xff1a; 自适应布局能力仅可以保证在外部容器大小在一定范围内变化时&#xff0c;容…

国外媒体推广软文宣发:促进海外宣发新风尚,迈向国际舞台

大舍传媒http://www.dashemeijie.com 序言 伴随全球经济一体化发展趋向&#xff0c;越来越多的中国企业希望在国际舞台上表现自己的总体水平。而国外媒体软文发稿作为一种全新的海外宣传方式&#xff0c;正逐渐成为促进海外宣发新风尚的主要常用工具。接下来我们就探讨国外媒…

Acrel-1000DP光伏监控系统在尚雷仕(湖北)健康科技有限公司5.98MW分布式光伏10KV并网系统的应用

摘 要&#xff1a;分布式光伏发电特指在用户场地附近建设&#xff0c;运行方式多为自发自用&#xff0c;余电上网&#xff0c;部分项目采用全额上网模式。分布式光伏全额上网的优点是可以充分利用分布式光伏发电系统的发电量&#xff0c;提高分布式光伏发电系统的利用率。发展分…

构建企业级微服务平台:实现可扩展性、弹性和高效性

在软件开发的快速发展领域中&#xff0c;企业不断努力构建健壮、可扩展和高效的系统。随着微服务架构的出现&#xff0c;再加上云原生技术的应用&#xff0c;创建敏捷且具有弹性的平台的可能性是无限的。在本指南中&#xff0c;我们将深入探讨使用强大的工具和技术组合&#xf…

苹果商店审核指南:确保Flutter应用顺利通过审核的关键步骤

引言 Flutter是一款由Google推出的跨平台移动应用开发框架&#xff0c;其强大的性能和流畅的用户体验使其备受开发者青睐。然而&#xff0c;开发一款应用只是第一步&#xff0c;将其成功上架到苹果商店才是实现商业目标的关键一步。本文将详细介绍如何使用Flutter将应用程序上…

​如何使用ArcGIS Pro进行洪水淹没分析

洪水淹没分析是一种常见的水文地理信息系统应用&#xff0c;用于模拟和预测洪水事件中可能受到淹没影响的地区&#xff0c;这里为大家介绍一下ArcGIS Pro进行洪水淹没分析的方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的DEM数据&…