代码随想录算法训练营第四十二天 _ 动态规划_01背包问题。

news2025/1/12 6:09:45

学习目标:

动态规划五部曲:
① 确定dp[i]的含义
② 求递推公式
③ dp数组如何初始化
④ 确定遍历顺序
⑤ 打印递归数组 ---- 调试
引用自代码随想录!

60天训练营打卡计划!

学习内容:

二维数组处理01背包问题

  • 听起来思路很简单,但其实一点也不好实现。
  • 动态规划五步曲:
    ① 确定dp[i][j]的含义 : 任取[0, i]的物品后放进容量为j的背包 所能放的 最大价值
    ② 求递推公式 : dp[i][j] = max(dp[i-1][j] , dp[i-1][ j - weight[i] ] + value[i])
    Ⅰ 不放物品 i : dp[i-1][j]
    Ⅱ 放物品 i : dp[i-1][j - weight[i]] + value[i]
    ③ dp数组如何初始化 : 按下表的第一行和第一列赋值,其中箭头都是继承来的值,画圈的表示自己取得了最大值。请添加图片描述
    ④ 确定遍历顺序 : 先物品后背包(行) / 先背包后物品(列)
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        //m,n分别代表物品种类和背包容量
        int itemSize = 0,bagSize = 0;
        Scanner sc = new Scanner(System.in);
        //获取itemSize和bagSize的值
        itemSize = sc.nextInt();
        bagSize = sc.nextInt();
        //初始化对应的重量数组和价值数组
        int[] weight = new int[itemSize];
        int[] value = new int[itemSize];
        //这两个都是物品的属性,大小只和物品数量有关
        for(int i = 0;i < itemSize;i++){
            weight[i] = sc.nextInt();
        }
        for (int i = 0;i < itemSize;i++){
            value[i] = sc.nextInt();
        }
        
        // int[] weight = {1,3,4};
        // int[] value = {15,20,30};
        // int bagSize = 4;
        testWeightBagProblem(weight,value,bagSize);
    }

    /**
     * 动态规划获得结果
     * @param weight  物品的重量
     * @param value   物品的价值
     * @param bagSize 背包的容量
     */
    public static void testWeightBagProblem(int[] weight, int[] value, int bagSize){

        int itemSize = weight.length;
        // dp数组的含义是:在[0,i]件物品中选择是否放入背包 的 最大价值
        int[][] dp = new int[itemSize][bagSize+1];
        
        // 初始化dp数组,默认都为0.
        // 只放一件物品时的初始化
        for(int j = weight[0]; j < bagSize+1; j++){
            dp[0][j] = value[0];
        }
        
        // 正常的为dp数组赋值,依赖左上位置的其他的dp值
        for(int i = 1; i < itemSize; i++){
            // j是背包容量
            for(int j = 1; j < bagSize+1; j++){
                // 如果容量不够放入新的物品,则从上一行继承
                if(j < weight[i])   dp[i][j] = dp[i-1][j];
                // 如果容量可以放入新的物品,则从上一行的左侧继承
                else
                    dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-weight[i]] + value[i]);
            }
        }
        System.out.println(dp[itemSize-1][bagSize]);
        
        // 打印dp数组
        // for (int i = 0; i < goods; i++) {
        //     for (int j = 0; j <= bagSize; j++) {
        //         System.out.print(dp[i][j] + "\t");
        //     }
        //     System.out.println("\n");
        // }
    }
}

一维数组处理01背包问题

  • 动态规划五步曲:
    ① 确定dp[j]的含义 : 任取物品放进容量为j的背包 所能放的 最大价值
    ② 求递推公式 : dp[j] = max(dp[j] , dp[j - weight[i]] + value[i])
    Ⅰ 不放物品 i : dp[j]
    Ⅱ 放物品 i : dp[j - weight[i]] + value[i]
    ③ dp数组如何初始化 : 初始值全部附0,长度为容量的长度加1(j+1)
    ④ 确定遍历顺序 : 必须先物品后背包(行),且便利背包大小时,必须使用倒序的顺序遍历。(为了防止一个物品被使用多次,倒叙遍历时相同的物品仅能被取用一次)

请添加图片描述

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        //m,n分别代表物品种类和背包容量
        int itemSize = 0,bagSize = 0;
        Scanner sc = new Scanner(System.in);
        //获取itemSize和bagSize的值
        itemSize = sc.nextInt();
        bagSize = sc.nextInt();
        //初始化对应的重量数组和价值数组
        int[] weight = new int[itemSize];
        int[] value = new int[itemSize];
        //这两个都是物品的属性,大小只和物品数量有关
        for(int i = 0;i < itemSize;i++){
            weight[i] = sc.nextInt();
        }
        for (int i = 0;i < itemSize;i++){
            value[i] = sc.nextInt();
        }
        
        // int[] weight = {1,3,4};
        // int[] value = {15,20,30};
        // int bagSize = 4;
        testWeightBagProblem(weight,value,bagSize);
    }

    /**
     * 动态规划获得结果
     * @param weight  物品的重量
     * @param value   物品的价值
     * @param bagSize 背包的容量
     */
    public static void testWeightBagProblem(int[] weight, int[] value, int bagSize){

        // 创建dp一维数组
        int goods = weight.length;  // 获取物品的数量
        int[] dp = new int[bagSize + 1];

        // 初始化dp数组
        // 创建数组后,其中默认的值就是0
        
        // 填充dp数组
        for (int i = 0; i < goods; i++) {
            // 必须使用倒叙遍历背包大小
            for (int j = bagSize; j > 0; j--) {
                // 防止越界错误
                if (j < weight[i]) {
                    dp[j] = dp[j];
                } else {
                    dp[j] = Math.max(dp[j] , dp[j-weight[i]] + value[i]);
                }
            }
        }
        
        System.out.print(dp[bagSize]);

        // 打印dp数组
        // System.out.print(dp[goods-1][bagSize] + "\n");
        // for (int i = 0; i < goods; i++) {
        //     for (int j = 0; j <= bagSize; j++) {
        //         System.out.print(dp[i][j] + "\t");
        //     }
        //     System.out.println("\n");
        // }
    }
}

在这里插入图片描述


学习时间:

  • 上午两个半小时,整理文档半小时。

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

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

相关文章

成品短视频app源码开发,你需要知道的最新动向

随着移动互联网的快速发展&#xff0c;短视频行业正迅速崛起。越来越多的创业者和开发者将目光投向了成品短视频app源码开发领域。下面我们将深入探讨这一领域的最新动向&#xff0c;带您了解成品短视频app源码开发的趋势与前景 成品短视频app源码开发的前景和机遇 短视频内容…

Latex正文引用图片编号,防止某张图片删除或调整导致正文序号对应错误

一、背景 Latex真的是非常好用的论文排版工具&#xff0c;虽然不像word一样是“所见即所得”的可视化方式&#xff0c;但完全不用管格式&#xff0c;包括图片的排版&#xff0c;文字的缩进等等。这在word里调整起来真的是非常麻烦&#xff0c;特别是某个段落、图片修改后&…

最热门超声波清洗机有哪些?热门超声波清洗机推荐

眼镜党朋友第一次接触超声波清洗机应该是在眼镜店的时候&#xff0c;把眼镜拿给老板他几分钟就搞定眼镜清洗的&#xff0c;是的没有错&#xff0c;那个机器叫超声波清洗机&#xff0c;不需要自己动手就可把眼镜清洗干净的一款智能清洁工具&#xff0c;它的出现可以说是方便了我…

关于svn如何上传一个完整的项目

注意&#xff1a;请一定要按照该步骤进行操作&#xff0c;请上传新项目时将项目名称进行规范命名 例如原始文件是arrange_v2 将此项目需要注入新的医院 则命名为 arrange_某医院名称_门诊或者医技或者药房_v2 重新命名文件夹名称快捷键 &#xff08;F12&#xff09; 一 &…

中断方式的数据接收2

Echo实验 回忆之前的实验因为数据处理的过程可以瞬间完成所以可以把数据处理的操作放在中断服务函数中执行 但是数据处理要是时间过长就将数据缓存处理 当使用中断方式接收数据的时候 一般有两种方式 数据处理的时间较短可放在中断服务函数内处理&#xff08;就地处理&#…

北斗如何保障能源安全?中海达再赴石油石化盛会推广新技术

11月29日-30日&#xff0c;第三届中国石油石化网络安全应用研讨会暨北斗导航能源安全技术交流会在深圳召开。本次活动主题为“石油石化网络安全&#xff0c;新时代、新征程”&#xff0c;由中国石油学会北斗导航与通信专业委员会、中石油、国家管网等单位联合举办。中海达受邀携…

Mac安装Linux虚拟机(M3)

环境&#xff1a;先贴出本人的电脑配置 一、选择虚拟机软件、下载并安装 比较常用的有VMware Fution、VirtualBox、Paralles Desktop等&#xff0c;我选择了Paralles Desktop&#xff08;买电脑增了一年的免费使用&#x1f604;&#xff09;从官网下载试用就行&#xff0c;之前…

CSS 绝对定位问题和粘性定位介绍

目录 1&#xff0c;绝对定位问题1&#xff0c;绝对定位元素的特性2&#xff0c;初始包含块问题 2&#xff0c;粘性定位注意点&#xff1a; 1&#xff0c;绝对定位问题 1&#xff0c;绝对定位元素的特性 display 默认为 block。所以行内元素设置绝对定位后可直接设置宽高。脱离…

53.redis分布式缓存

目录 一、单机安装Redis。 二、Redis主从集群。 2.1.集群结构 2.2.准备实例和配置 2.3.启动 2.4.开启主从关系 2.5.测试 三、搭建哨兵集群。 3.1.集群结构 3.2.准备实例和配置 3.3.启动 3.4.测试 四、搭建分片集群。 4.1.集群结构 4.2.准备实例和配置 4.3.启动…

【AI读论文】大模型时代:AutoML的机遇、挑战与风险

Title&#xff1a;AutoML in the Age of Large Language Models: Current Challenges, Future Oportunities and Risks Paper&#xff1a;https://arxiv.org/pdf/2306.08107 I. 概要 本文主要阐述了在大模型时代&#xff0c;自动化机器学习&#xff08;AutoML&#xff09;与大型…

硬件基础:三极管

之前我们学习了二极管&#xff0c;二极管的最大特性就是单向导通性。 现在我们又有了新的需求&#xff0c;那就是将信号放大&#xff0c;之前学习的无源器件或者二极管&#xff0c;都无法做到这一点。所以&#xff0c;为了满足放大信号的需求&#xff0c;三极管就顺势而生。 最…

贸易公司ERP用什么软件好

不同行业的贸易公司有不同的业务结构和管理模式&#xff0c;日常经营管理过程中遇到的难点呈现多样化&#xff0c;而很多贸易公司在仓库、财务、销售、采购、订单、客户等业务一体化和部门协同效率等方面还有很多提升空间。 有些贸易公司涉及多仓库、多门店、多税制、多汇率、…

程序员如何养生?

程序员长期面对电脑屏幕&#xff0c;加班、压力大等因素容易导致身体不适&#xff0c;以下是一些养生建议&#xff1a; 多休息&#xff1a;保证每天充足的睡眠时间&#xff0c;不要熬夜&#xff0c;尽量避免加班。 平衡饮食&#xff1a;均衡饮食&#xff0c;多吃蔬菜水果&…

你不得不知道的工业镜头使用中的常见问题

镜头的基本功能就是实现光束变换&#xff08;调制&#xff09;&#xff0c;在机器视觉系统中&#xff0c;工业镜头的主要作用是将目标成像在图像传感器的光敏面上。工业镜头是机器视觉系统设计的重要环节。在实际应用过程中&#xff0c;会遇到以下常见问题。 1、Q&#xff1a;…

CSS新手入门笔记整理:CSS背景样式

背景颜色&#xff1a;background-color 语法 background-color:颜色值; 颜色值有两种 一种是“关键字”&#xff0c;指的是颜色的英文名称&#xff0c;如red、green、blue等。参考CSS 颜色名称。另外一种是“十六进制RGB值”&#xff0c;类似“#FBE9D0”形式的值。参考十六…

移动平均滤波的原理和C代码

移动平均滤波是一种简单有效的平滑信号的方法&#xff0c;它通过计算一系列数据点的平均值来减小信号中的波动。基本的移动平均滤波方法有两种&#xff1a;简单移动平均&#xff08;SMA&#xff09;和指数加权移动平均&#xff08;EWMA&#xff09;。 简单移动平均滤波&#xf…

封装了一个顺滑嵌套滚动的框架

首先查看效果图 就是开始滚动的时候&#xff0c;上面的头部和下面的内容是 一起滚动的&#xff0c;但是当滚动到segment 的时候&#xff0c;segment 是悬停 的&#xff0c;下面的tableView是分区的 架构设计 我们设计一个架构&#xff0c;以下面的tablView为主体&#xff0…

Ubuntu系统配置深度学习环境之nvidia显卡驱动和cuda安装

前言 NVIDIA 显卡驱动是为了确保 NVIDIA 显卡能够正确运行而开发的软件。显卡驱动负责与操作系统通信&#xff0c;管理显卡的各种功能&#xff0c;并提供性能优化和兼容性保证。安装适用于特定显卡型号和操作系统版本的最新驱动程序是确保显卡能够正常工作的重要步骤。 CUDA 是…

Python:核心知识点整理大全1-笔记

在本章中&#xff0c;你将运行自己的第一个程序——hello_ world.py。为 此&#xff0c;你首先需要检查自己的计算机是否安装了Python&#xff1b;如果没有安装&#xff0c; 你需要安装它。你还要安装一个文本编辑器&#xff0c;用于编写和运行Python 程序。你输入Python代码时…

【Altera】Cyclone10 FPGA DDR3使用

目录 开发板 硬件 框图 原理图 测试工具 DDR IP核配置 调试及遇到的问题 读写仲裁时序 问题1.拉高read后&#xff0c;wait一直没反应 问题2.DDR校正不过的一个可能性 延伸学习 开发板 Intel官方提供c10的开发套件&#xff1a;Intel Cyclone 10 GX FPGA Development …