代码随想录第四十二天| ● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集

news2024/11/25 10:32:33

01背包问题

模型详解

  1. 描述
    在一个容量有限的 背包里装若干物品,这些物品重量不同,价值不同。如何装使这些背包内物品价值最大。
    (1)如果物品可以分割,直接用贪心算法,首先装价值密度最大的物品
    (2)如果物品不能分割,使用==动态规划 ==
  2. 01背包与完全背包的区别
    0,1:每件物品只能用一次,要么不装,要么只装一次
    多重背包:每件物品可以装多次
  3. 0,1背包递推公式详解

在这里插入图片描述

(1)dp【i】【j】:从0,i中任取物品,放到容量为就j的背包里,最大价值。
(2)递推公式
对于第i件物品,可以选择不放,也可以选择放
dp【i】【j】=max(dp【i-1】【j】,dp【i-1】【j-w【i】】+v【i】)
(3)
初始化
在这里插入图片描述

(5)略

代码

    // 01背包二维数组
public int testWeightBagProblem01(int[] weight, int[] value, int bagSize){
    int[][] dp = new int[weight.length][bagSize+1];// dp[i][j]从 0-i中选取物品放到容量为j的背包的最大价值
    // 初始化
    for (int i = 0; i < dp.length; i++) {
        dp[i][0]=0;
    }

    for (int i = 0; i <=bagSize; i++) {
        if (weight[0]>i){
            dp[0][i]=0;
        }else {
            dp[0][i]=value[0];
        }
    }

    // 递归
    for (int i = 1; i <dp.length ; i++) {
        for (int j = 0; j <=bagSize ; j++) {
            if (weight[i]>j){
                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]);
            }
        }
    }
    return dp[weight.length-1][bagSize];

    }

滚动数组代码

j从右往左遍历,可以将二维数组化简为一维数组
在这里插入图片描述

```// 02背包滚动数组
    public int testWeightBagProblem02(int[] weight, int[] value, int bagSize){
        int[] dp = new int[bagSize+1];// dp[i][j]从 0-i中选取物品放到容量为j的背包的最大价值
        // 初始化
        for (int i = 0; i <=bagSize; i++) {
            if (weight[0]>i){
                dp[i]=0;
            }else {
                dp[i]=value[0];
            }
        }

        // 递归
        for (int i = 1; i <weight.length ; i++) {
            for (int j = bagSize; j >=0 ; j--) {
                if (weight[i]>j){
                    dp[j]=dp[j];
                }else {
                    dp[j]=Math.max(dp[j],dp[j-weight[i]]+value[i]);
                }
            }
        }
        return dp[bagSize];

    }

分割等和子集

在这里插入图片描述

看完题后的思路

这是一个0,1背包问题,背包的容量是 sum(元素)/2,物品是元素,重量是元素的值,价值也是元素的值。===> 在所有物品中挑选元素,在满足背包ronglde前提下,使价值最大,判断最大价值是否 等于背包容量
如果装满,最大价值一定等于背包容量,因为价值密度为1

代码

// 416 分割子集
    public boolean canPartition(int[] nums) {
        int sum=0;
        for (int num : nums) {
            sum+=num;
        }
        if (sum%2==1){
            return false;
        }
        int bagSize=sum/2;
        int[] dp = new int[bagSize + 1];
        // 初始化
        for (int j = 0; j <=bagSize; j++) {
            if (j<nums[0]){ // 重量
                dp[j]=0;
            }else {
                dp[j]=nums[0];// 价值
            }
        }
        for (int i = 1; i <nums.length ; i++) {
            for (int j = bagSize; j >=0 ; j--) {
                if (nums[i]>j){
                    dp[j]=dp[j];
                }else {
                    dp[j]= Math.max(dp[j],dp[j-nums[i]]+nums[i]);
                }
            }
        }
        
        return dp[bagSize]==bagSize;


    }

复杂度

时间复杂度 0(n^2)
空间复杂度 0(n)
在这里插入图片描述

收获

三刷刷一遍

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

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

相关文章

acwing3485最大异或和(trie树,贪心)

给定一个非负整数数列 a&#xff0c;初始长度为 N。 请在所有长度不超过 M 的连续子数组中&#xff0c;找出子数组异或和的最大值。 子数组的异或和即为子数组中所有元素按位异或得到的结果。 注意&#xff1a;子数组可以为空。 输入格式 第一行包含两个整数 N,M。 第二行…

【数字IC基础】黑盒验证、白盒验证、 灰盒验证

文章目录 一、黑盒验证二、白盒验证三、灰盒验证一、黑盒验证 1、黑盒验证:大多数基于仿真的验证环境都是黑盒验证;2、不需要知道设计的内部结构和特性,只需要在输入端口打激励,观察输出即可;3、验证工程师学习设计的规格,然后编写验证环境中的 drivers, monitors, check…

如何提高机器人专业课讲师的收入

先放一些总结&#xff1a;为什么我是不合格的高校机器人工程专业讲师&#xff1f;2020不合格肯定收入不会提升&#xff0c;甚至失业风险会非常高的。为何所做的课程努力几乎全部失败呢&#xff1f;→机器人工程类← 2022不能一次次失败&#xff0c;因为只有自己会为失败买单&am…

【经典蓝牙】蓝牙 A2DP协议分析

A2DP 介绍 A2DP(Advanced Audio Distribution Profile)是蓝牙高音质音频传输协议&#xff0c; 用于传输单声道&#xff0c; 双声道音乐&#xff08;一般在 A2DP 中用于 stereo 双声道&#xff09; &#xff0c; 典型应用为蓝牙耳机。 A2DP旨在通过蓝牙连接传输高质量的立体声音…

【教程】Notion笔记多平台设置中文显示

这个笔记软件界面挺好看&#xff0c;惊艳到了。 目录 网页版 桌面端 Windows版 Mac端 安卓端 网页版 直接安装这个插件即可&#xff0c;Chrome/Edge适用&#xff1a;Notion中文版 桌面端 都要去这个github下载语言包&#xff0c;用于替换文件&#xff1a;https://github.c…

智能家居项目(五)测试串口功能

目录 一、写一个单独测试串口的demo 二、直接运行上一篇智能家居的代码 一、写一个单独测试串口的demo 1、TTL串口与树莓派的连接方式 &#xff08;1&#xff09;TTL的RXD和TXD针脚连接到树莓的TXD和RXD上&#xff08;T–>R R–>T&#xff09;&#xff0c;交叉连&…

ChatGPT是如何训练得到的?通俗讲解

首先声明喔&#xff0c;我是没有任何人工智能基础的小白&#xff0c;不会涉及算法和底层原理。 我依照我自己的简易理解&#xff0c;总结出了ChatGPT是怎么训练得到的&#xff0c;非计算机专业的同学也应该能看懂。看完后训练自己的min-ChatGPT应该没问题 希望大牛如果看到这…

ACSC 2023 比赛复现

Admin Dashboard 在 index.php 中可以看到需要访问者是 admin 权限&#xff0c;才可以看到 flag。 report.php 中可以让 admin bot 访问我们输入的 url&#xff0c;那么也就是说可以访问 addadmin.php 添加用户。 在 addadmin.php 中可以添加 admin 用户&#xff0c;但是需…

git的使用(终端输入指令)下

文章目录前言1、git 分支创建分支查看分支切换分支合并分支删除分支2.提交到远程仓库远程提交链接一下自己仓库总结前言 上章链接 &#xff1a;git的使用&#xff08;终端输入指令&#xff09;上 我们接着上着来说 上章把 git 的 功能实现了一部分&#xff0c;本章我们接着上文…

Hive入门学习

文章目录1.概述1.1 hive与hadoop的关系1.2 映射信息记录1.3 hive架构图Hive组件2.Hive数据模型2.1 Table2.2 Partition2.3 Buckets3.元数据相关名词3.1 Metadata3.2 Metastore3.3 metastore三种配置方式3.3.1 内嵌模式3.3.2 本地模式3.3.3 远程模式1.概述 Apach hive 是一款建…

并发编程-学习总结(上)

目录 1、线程基础 1.1、线程实现方法 1.2、如何正确停止线程 1.3、Java线程的六种状态 1.4、wait/notify/notifyAll注意事项 1.4.1、为什么 wait 、notify、notifyAll必须在 synchronized 保护的同步代码中使用&#xff1f; 1.4.2、为什么 wait/notify/notifyAll 被定义…

浅谈QWebChannel、QWebChannelAbstractTransport、QWebSocketServer、QWebSocket用法及之间关系

1.前言在现实业务中&#xff0c;经常遇到这样的需求&#xff1a;一端采用web形式开发的&#xff0c;如&#xff1a;客户端采用html、javascript、nodejs开发&#xff1b;而另一端采用C开发&#xff0c;如&#xff1a;Qt开发的服务端。web页面端需和Qt开发的服务端进行通信、数据…

深入理解java虚拟机精华总结:如何判断对象是否可回收、引用、finalize、方法区回收、垃圾收集算法、垃圾收集器、内存分配与回收策略

深入理解java虚拟机精华总结&#xff1a;如何判断对象是否可回收、引用、finalize、方法区回收、垃圾收集算法、垃圾收集器、内存分配与回收策略如何判断对象是否可回收引用计数可达性分析法引用finalize方法区回收垃圾收集算法标记-清除算法标记-复制算法标记-整理算法垃圾收集…

141周期acwing(kmp)

一个字符串的前缀是从第一个字符开始的连续若干个字符&#xff0c;例如 abaab 共有 5 个前缀&#xff0c;分别是 a&#xff0c;ab&#xff0c;aba&#xff0c;abaa&#xff0c;abaab。 我们希望知道一个 N 位字符串 S 的前缀是否具有循环节。 换言之&#xff0c;对于每一个从…

_vue-1

谈谈你对MVVM的理解 为什么要有这些模式&#xff0c;目的&#xff1a;职责划分、分层&#xff08;将Model层、View层进行分类&#xff09;借鉴后端思想&#xff0c;对于前端而已&#xff0c;就是如何将数据同步到页面上 MVC模式 代表&#xff1a;Backbone underscore jquer…

Docker buildx 的跨平台编译

docker buildx 默认的 docker build 命令无法完成跨平台构建任务&#xff0c;我们需要为 docker 命令行安装 buildx 插件扩展其功能。buildx 能够使用由 Moby BuildKit 提供的构建镜像额外特性&#xff0c;它能够创建多个 builder 实例&#xff0c;在多个节点并行地执行构建任…

YOLOv5模型学习记录

新年伊始&#xff0c;YOLOv8横空出世&#xff0c;这个还未开源时便引发界内广泛热议的目标检测算法&#xff0c;一经问世便再次引发热潮&#xff0c;而作为与其师出同源的YOLOv5&#xff0c;自然要拿来与其比较一番。接下来我们便来学习一下吧。 模型结构 首先便是模型结构了…

Lambda原理及应用

Lambda原理及应用 Lambda介绍 Lambda 是 JDK8 以后版本推出的一个新特性&#xff0c;也是一个重要的版本更新&#xff0c;利用 Lambda 可以简化内部类&#xff0c;可以更方便的进行集合的运算&#xff0c;让你的代码看起来更加简洁,也能提升代码的运行效率。 Lambda语法 非…

优先级队列(堆)  堆排序

前面介绍过队列&#xff0c;队列是一种先进先出(FIFO)的数据结构&#xff0c;但有些情况下&#xff0c;操作的数据可能带有优先级&#xff0c;一般出队列时&#xff0c;可能需要优先级高的元素先出队列&#xff0c;该中场景下&#xff0c;使用队列显然不合适&#xff0c;比如&a…

【数据库】MySQL

时间戳 可以在创建表的时候&#xff0c;创建时间戳 mysql数据库怎么加入时间戳_帅气的黑桃J的博客-CSDN博客_mysql 插入时间戳 数据库表的命名规范 数据库表字段命名规范 - 腾讯云开发者社区-腾讯云 (tencent.com) MySql 的大小写问题 以下是MySQL详细的大小写区分规则&am…