【01背包理论】01背包问题dp[j](滚动数组) <动态规划板子>

news2025/1/21 9:31:28

【01背包理论】01背包问题dp[j]

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

题解

动态规划

  • 确定 dp 数组以及下标的含义
    滚动数组 dp[j] :容量为 j 的背包,所背的物品价值可以最大为 dp[j]

  • 确定递推公式
    dp[j]为 容量为 j 的背包所背的最大价值:
    dp[j] 可以通过dp[j - weight[i]]推导出来,dp[j - weight[i]]表示容量为j - weight[i]的背包所背的最大价值。dp[j - weight[i]] + value[i] 表示 容量为 j - 物品i重量 的背包加上物品i的价值。(也就是容量为j的背包,放入物品i了之后的价值即:dp[j]
    dp[j]有两个选择:

    • 一个是取自己 dp[j] 相当于二维dp数组中的dp[i-1][j],即不放物品i(更上次一样)。
    • 一个是取dp[j - weight[i]] + value[i],即放物品i,指定是取最大的,毕竟是求最大价值。
dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
  • dp数组如何初始化

dp[j]表示:容量为j的背包,所背的物品价值可以最大为dp[j],首先 dp[0]=0
dp 数组在推导的时候一定是取价值最大的数,如果题目给的价值都是正整数那么非0下标都初始化为0就可以,即其他下标的值均初始化为0,这样才能让dp数组在递归公式的过程中取的最大的价值,而不是被初始值覆盖。

  • 确定遍历顺序
    二维dp遍历的时候,背包容量是从小到大一维dp遍历的时候,背包是从大到小
    先正序物品再逆序背包,倒序遍历是为了保证物品i只被放入一次,一旦正序遍历了,那么物品0就会被重复加入多次。
for(int i = 0; i < weight.size(); i++) { // 遍历物品
    for(int j = bagWeight; j >= weight[i]; j--) { // 遍历背包容量
        dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);

    }
}
  • 举例推导 dp 数组(打印 dp 数组)
    背包最大重量为4。物品:
重量价值
物品0115
物品1320
物品2430

在这里插入图片描述

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

    public static void testWeightBagProblem(int[] weight, int[] value, int bagWeight){
        int wLen = weight.length;
        //定义dp数组:dp[j]表示背包容量为 j 时,能获得的最大价值
        int[] dp = new int[bagWeight + 1];
        
        //遍历顺序:先遍历物品,再遍历背包容量(倒序)
        for (int i = 0; i < wLen; i++){
            for (int j = bagWeight; j >= weight[i]; 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/966581.html

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

相关文章

wxpython: 数字时钟秒表

wxpython 数字时钟秒表&#xff1b;定时器和线程>示例 编写 wx_clock.py 如下 # -*- coding: utf-8 -*- """ 定时器和线程>示例""" import wx import time import threadingclass MyFrame(wx.Frame): def __init__(self):""…

【Java核心知识】线程基础知识

文章目录 线程线程与进程的区别创建线程的方法方法一&#xff1a;继承Thread类方法二&#xff1a;实现Runnable接口方法三&#xff1a;使用Callable和FutureTask创建带返回值的线程方法四&#xff1a;通过线程池创建线程 线程的基本操作线程的状态守护线程 线程 线程与进程的区…

基于Java的学生宿舍管理系统,springboot+jsp,MySQL数据库,前后端分离,学生+宿舍管理员+系统管理员三种身份,完美运行,有一万字论文。

基于Java的学生宿舍管理系统&#xff0c;springbootjsp&#xff0c;MySQL数据库&#xff0c;前后端分离&#xff0c;学生宿舍管理员系统管理员三种身份&#xff0c;完美运行&#xff0c;有一万字论文。 学生&#xff1a;个人信息管理、保修、假期&#xff08;入校、离校&#x…

【网络】路由配置实践

网络实践-路由篇 本文使用vmware虚拟机进行路由表配置实践&#xff0c;通过配置路由表连接两个不同的网络 网络规划&#xff1a; 准备三台centos7虚拟机&#xff0c;其中一台作为路由设备router&#xff0c;其余两台分别代表处在不通网络中的pc1和pc2。因此router虚拟机需要分…

IntelliJ IDEA的远程开发(Remote Development)

DEA的远程开发功能&#xff0c;可以将本地的编译、构建、调试、运行等工作都放在远程服务器上执行&#xff0c;而本地仅运行客户端软件进行常规的开发操作即可&#xff0c;官方给出的逻辑图如下&#xff0c;可见通过本地的IDE和服务器上的IDE backend将本地电脑和服务器打通&am…

iOS设备管理软件iMazing2024

文件系统是一种用于在存储设备上组织文件和文件夹的系统。所有的存储设备&#xff08;如计算机、USB存储器、手机等&#xff09;都有着自己的文件系统。 iMazing文件系统功能将iOS设备中封闭而复杂的文件管理系统整合在一起&#xff0c;让您管理文件像在电脑中使用Windows文件…

肖sir __linux__面试题和考核05

面试题 1、查看linux中第11行到第20行的数据&#xff08;比如文档a 有30行&#xff09; 方法1&#xff1a;tail -n 11 mm |head -n10 n 表示从第10行开始&#xff0c;取前10行 方法2&#xff1a;head -n -10 mm| tail -n 10 表示从末尾第10行开始&#xff0c;最后10行 方法3&am…

ThreadLocal原理剖析

一.ThreadLocal的含义 ThreadLocal也就是线程本地变量&#xff0c;创建了一个ThreadLocal变量&#xff0c;访问这个变量的每个线程都会有这个变量的一个本地拷贝&#xff0c;多个线程操作这个变量的时候&#xff0c;实际上是操作自己本地内存里面的变量&#xff0c;从而起到线…

基于单片机的简易智能电动车设计

一、项目介绍 智能交通工具在现代社会中起着越来越重要的作用&#xff0c;电动车作为一种环保、便捷的交通工具&#xff0c;受到了广泛的关注和应用。本设计基于单片机技术&#xff0c;设计一款简易智能电动车&#xff0c;实现基本的控制和功能&#xff0c;并提供良好的用户体…

kubectl入门

一.kubectl的三种资源管理方式&#xff1a; 二. kubectl资源介绍&#xff1a; 1.namespace&#xff1a;实现多套环境的资源隔离或者多租户的资源隔离。k8s中的pod默认可以相互访问&#xff0c;如果不想让两个pod之间相互访问&#xff0c;就将其划分到不同ns下。 2.pod&#x…

搭建Python开发环境

开发环境 Python是一种跨平台 的编程语言&#xff0c;这意味着它能够在所有的主流操作系统中运行&#xff0c;开发者可以Windows、Linux、Mac中开发和学习Python&#xff0c;甚至在Android手机中也可以运行Python代码。 在所有安装了Pythonr现代计算机上&#xff0c;都能够运…

华为OD:敏感字段加密

题目描述&#xff1a; 给定一个由多个命令字组成的命令字符串&#xff1a; 1、字符串长度小于等于127字节,只包含大小写字母,数字,下划线和偶数个双引号&#xff1b; 2、命令字之间以一个或多个下划线_进行分割&#xff1b; 3、可以通过两个双引号”"来标识包含下划线…

自定义创建项目

基于VueCli自定义创建项目 1.Eslint代码规范 代码规范:一套写代码的约定规则。 比如 赋值符号的左右是否需要空格 一句话结束是否要加&#xff1b; 正规的团队 需要统一的编码风格 https://standardjs.com/rules-zhcn.html 规则查找 https://zh-hans.eslint.org/docs/late…

CESM2代码下载

这半年忙着毕业写论文&#xff0c;好久好久好久不更新了∠( ω)&#xff0f; &#xff0c;今天准备开个新坑 ๑乛◡乛๑&#xff0c;学习一下CESM&#xff08;Community Earth System Model&#xff09;&#xff0c;它是一个完全耦合的全球气候模型&#xff0c;可用于地球过去、…

千纸鹤APP云验证系统源码 APK注入引流弹窗

千纸鹤APP云验证系统是一款全面的验证系统&#xff0c;包括网络验证、APK注入、注册机、引流弹窗、更新弹窗等功能。该系统提供完整的源代码&#xff0c;方便开发者二次开发和定制化需求。 可以对用户进行多种验证&#xff0c;包括账号密码验证、短信验证码验证等。该系统还提供…

jmeter 常数吞吐量定时器

模拟固定吞吐量的定时器。它可以控制测试计划中各个请求之间的时间间隔&#xff0c;以达到预期的吞吐量。 参数包括&#xff1a; Target Throughput&#xff1a;目标吞吐量&#xff08;每分钟请求数&#xff09;Calculate Throughput based on&#xff1a;吞吐量计算基准&…

机器人中的数值优化(七)——修正阻尼牛顿法

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考&#xff0c;主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等&#xff0c;本系列文章篇数较多&#xff0c;不定期更新&#xff0c;上半部分介绍无约束优化&#xff0c;…

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书南京师范大学图书馆

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书南京师范大学图书馆

程序员工作技巧

提高工作技巧的秘方 案例 让我们猜测一下 绵羊想表达的什么&#xff1f; 并不够准确 崩了&#xff0c;不能用了整个业务瘫痪了研发没有责任感 语义规则/模棱俩可 相对语言 量化数据表达&#xff1a;疼苦指数&#xff0c;拥堵指数&#xff0c;准确。 尽量减少标签化评价 标签…

iPhone 隔空投送使用指南:详细教程

本文介绍了如何在iPhone上使用隔空投送,包括如何在iOS 11到iOS 14的iPhone上启用它、发送文件以及接受或拒绝AirDrop发送给你的文件。对于iOS 7以上的旧款iPhone,提供了另一种方法。 如何打开隔空投送 你可以通过以下两种方式之一启动隔空投送功能:在“设置”应用程序或控…