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

news2024/11/25 6:58:24

文章目录

      • 01背包问题,你该了解这些!
      • 01背包问题,你该了解这些! 滚动数组
      • 416. 分割等和子集

01背包问题,你该了解这些!

  • 题目链接:代码随想录

二维数组解决0-1背包问题

  • 解题思路:
    1.dp[i]|[j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少。
    2.确定递推公式:不放物品i,放物品i dp[i]|[j] = max(dp[i - 1]|[j], dp[i - 1]|[j - weight[i]] + value[i]);
    3.初始化;当前处理的结果都是由左上角推出来的,所以只用初始化左上和即可,即第一行和第一列
    4.确定遍历顺序:本题无论是先遍历背包还是先遍历物品都可以

  • 图像理解

    QQ图片20230425164343
public class BagProblem {
    public static void main(String[] args) {
        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){

        //1.创建dp数组
        //dp[i][j] 表示从0-i个物品中挑选物品,放入容量为j的背包中,所取得的最大价值
        int length = weight.length;
        int[][] dp = new int[length][bagSize + 1];

        //2.初始化数据,只初始化第一行,第一列默认初始化为0
        for (int i = weight[0]; i < dp.length; i++) {//i为物品0的重量
            dp[0][i] = value[0];
        }

        //3.遍历dp数组
        for (int i = 1; i < weight.length; i++) {

            for (int j = 1; j < bagSize + 1; j++) {
                
                if(j < weight[i]){
                    /**
                     * 当前背包的容量都没有当前物品i大的时候,是不放物品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-weight[i]] + value[i]);
                }

            }

        }

        for (int i = 0; i < length; i++) {
            for (int j = 0; j <= bagSize; j++) {
                System.out.print(dp[i][j] + "\t");
            }
            System.out.println("\n");
        }



    }
}

01背包问题,你该了解这些! 滚动数组

  • 题目链接:代码随想录

一维数组解0-1背包问题

  • 每次放入一个物品之后,求得的dp数组就是能放下一个物品的容量的最大价值

    因此不用太考虑放入一个物品后前后容量关系,就考虑一个个将物品完全放入背包即可

  • 解题思路:
    1.dp[j]表示:容量为j的背包,所背的物品价值可以最大为dp[j]
    2.dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
    3.dp数组初始化的时候,都初始为0。这样才能让dp数组在递归公式的过程中取的最大的价值,而不是被初始值覆盖了
    4.先遍历放入物品,再遍历不同容量的背包,从后向前遍历

  • 图像理解:

    开始向背包里放的时候

    Snipaste_2023-04-25_18-50-19

public class BagProblemOneArray{
    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] + " ");
        // }

        int goodsLength = weight.length;//背包的个数
        int[] dp = new int[bagWeight + 1];//dp数组

        for (int i = 0; i < goodsLength; i++) {
            for (int j = bagWeight; j >= weight[i]; j--) {
                dp[j] = Math.max(dp[j],dp[j - weight[i]] + value[i]);
            }
        }

        for (int i = 0; i <= bagWeight; i++) {
            System.out.print(dp[i] + " ");
        }
    }
}

416. 分割等和子集

  • 题目链接代码随想录

本题因为元素只能用一次,因此是0-1背包问题
整体思路,找到元素价值量能恰好装进符合价值sum/2的容量的背包
本题每个商品价值量 = 重量

  • 解题思路:

    1. dp[j] 表示: 容量为j的背包,所背的物品价值最大可以为dp[j]。
      那么如果背包容量为target, dp[target]就是装满 背包之后的重量,所以 当 dp[target] == target 的时候,背包就装满了
    2. 递推公式:背包里放入数值,那么物品i的重量是nums[i],其价值也是nums[i]。所以递推公式:dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);
    3. 初始化:dp数组都初始化为0
    4. 从后向前
  • 图像理解:

    image-20230425194038426

public boolean canPartition(int[] nums) {
    //dp数组
    // 总和不会大于20000,背包最大只需要其中一半,所以10001大小就可以了    
    int[] dp = new int[10001];

    int sum = 0;

    //计算总和
    for (int i = 0; i < nums.length; i++) {
        sum += nums[i];
    }

    if(sum % 2 == 1){return false;}//为奇数,分成两个集合,必不成立

    int target = sum;

    //0-1背包
    for (int i = 0; i < nums.length; i++) {
        for (int j = target; j >= nums[i];j--) {//j从target开始,因为背包目标重量为即最后求解的结果
            dp[j] = Math.max(dp[j],dp[j - nums[i] + nums[i]]);
        }
    }

    if(dp[target] == target){
        return true;
    }

    return false;
}

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

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

相关文章

tensorflow ---gpu的环境配置

1. CUDA配置&#xff1a; 先鼠标右键查看对应的CUDA的版本&#xff1a; 2.安装CUDA&#xff1a; 1.点击 CUDA去官网来下载安装包。 这里我选择的是我电脑支持的9.0的版本&#xff1a; 2.下载CUDA安装包&#xff1a; 3. 安装CUDA的过程&#xff1a; 自定义安装路径&#xff…

RabbitMQ --- 简介、快速入门

一、初识MQ 1.1、同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复 两种方式各有优劣&#xff0c;打电话可以立即得到响应&#xff0c;但…

【论文精度(李沐老师)】Deep Residual Learning for Image Recognition

Deep Residual Learning for Image Recognition 残差连接主要干的一个事情是&#xff1a; 如果你新加的层不能让你的模型变好的时候&#xff0c;因为有残差连接的存在&#xff0c;可以使新加的那些层不会学到任何东西。 Abstract &#xff08;提出问题&#xff09;深的神经网…

STM32-HAL-定时器(无源蜂鸣器的驱动)

文章目录 一、蜂鸣器的介绍二、常用的无源蜂鸣器的电路三、测试准备四、初始化片上外设4.1 初始化定时器4的通道2为PWM输出模式4.2 编写驱动代码4.3 Logic分析仪查看波形4.4 代码分析 一、蜂鸣器的介绍 有源蜂鸣器&#xff1a; 有源蜂鸣器内部有一个发声电路,也就是“源”&…

程序员那些“越早知道越好的”道理

目录 程序员那些“越早知道越好的”道理1、学会阅读文档2、学会调试代码3、学会使用版本控制工具4、学会编写测试代码5、学会提问6、学会使用搜索引擎7、学会读懂源代码 程序员那些“越早知道越好的”道理 作为一名程序员&#xff0c;有很多话想对新手说&#xff0c;因为这些话…

ctr特征重要性建模:FiBiNetFiBiNet++模型

FiBiNET&#xff08;Feature Importance and Bilinear feature Interaction NETwork&#xff09;为推荐系统的CTR模型提出了一些创新方向&#xff1a; 引入一个SENet模块&#xff0c;可以动态学习特征的重要性&#xff1b;引入一个双线性模块&#xff08;Bilinear-Interaction…

在当前互联网行情下,Android想转音视频开发,会有前景吗?

前言 近年来&#xff0c;由于三年疫情的影响&#xff0c;很多公司都开始陆陆续续的在裁员&#xff0c;Android开发工作岗位也是&#xff0c;可能有些从事Android开发的朋友还没有意识到&#xff0c;Android开发岗位正在变少&#xff0c;求职者&#xff0c;僧多粥少&#xff0c…

数据可视化大屏电商数据展示平台开发实录(Echarts柱图曲线图、mysql筛选统计语句、时间计算、大数据量统计)

数据可视化大屏电商数据展示平台 一、前言二、项目介绍三、项目展示四、项目经验分享4.1 翻牌器4.1.1 翻牌器-今日实时交易4.1.2.翻牌器后端统计SUM函数的使用 4.2 不同时间指标的数据MySql内部的时间计算 4.3 实时交易播报MySql联表查询和内部遍历循环 4.4 每日交易量4.4.1.近…

Flutter开发日常练习-小猫咪杂货店(新增欢迎页,广告页和侧滑页面)

养小猫咪的伙伴来我的店铺逛逛吧!抖音商城搜索#早睡早起的猫咪小铺子 Flutter开发日常练习-小猫咪杂货店(新增动画和跳转抖音)_workersJiaDa的博客-CSDN博客URL Launcher是一个Flutter插件&#xff0c;它允许您的应用程序启动网络浏览器、地图应用程序、拨号器应用程序、邮件应…

Object Manager中的Hierarchy Columns

【前言】&#xff1a;最近偶然发现Object Manager中多了一项Hierarchy Columns&#xff0c;正好在做Case Mgmt这块的业务&#xff0c;需要做Case Hierarchy&#xff0c;或许熟悉这个新概念对后续方案的落地有一定启发。 #1. Account Hierarchy - 这个是标准功能&#xff0c;Acc…

【Winform学习笔记(二)】TextBox文本框实现按回车键触发Button事件

TextBox文本框实现按回车键触发Button事件 前言正文1、实现方法2、具体代码3、实现效果 前言 在本文中主要介绍 如何基于 Winform 框架实现 TextBox 文本框实现按回车键触发 Button 事件&#xff0c;该功能可实现在文本框中输入密码后不需要按登录或确定按钮&#xff0c;直接回…

如果建立一个由AI组成的社会……

你有没有想过&#xff0c;如果我们建立一个完全由AI组成的公民社会团体&#xff0c;让它们模仿人类的文明发展&#xff0c;那么这个AI社会最终将会进化到何种文明程度&#xff1f;需要明确的是AI社会只有AI&#xff0c;没有人类&#xff0c;完全是AI之间互相沟通交流&#xff0…

制作剧本杀小游戏系统

制作剧本杀小游戏软件的功能可以包括以下几点&#xff1a; 角色设定和分配&#xff1a;提供多种角色供玩家选择&#xff0c;根据玩家数量随机分配角色。 剧情框架&#xff1a;提供预设的剧情框架&#xff0c;或者允许用户自定义剧情。 背景设定&#xff1a;提供游戏…

图像处理:高斯滤波算法

目录 前言 概念介绍 基本原理 卷积核的大小 卷积核的形状和权重比 卷积核的归一化 结论 Opencv实现高斯滤波 Python手写实现高斯滤波 参考文章 前言 在此之前&#xff0c;我曾在此篇中推导过图像处理&#xff1a;推导五种滤波算法&#xff08;均值、中值、高斯、双边…

linux 命令之 tar -czvf和 tar -xzvf

文章目录 一、概述&#xff1a;二、基础知识 一、概述&#xff1a; tar 用于linux 系统中压缩和解压 二、基础知识 tar常用命令参数说明 tar命令的czvf/xzvf参数分别代表的意义如下&#xff1a; -c 或–create 建立新的备份文件。 -x或–extract或–get 从备份文件中还原文件…

为什么用Selenium做自动化测试

手工测试的问题 手工操作点点点借助的是人脑的反应和聪明&#xff0c;为什么不用手点了呢&#xff1f;手会酸&#xff0c;脑子会累&#xff0c;会占据太多的时间。想一想为什么会学习自动化测试。我们都希望通过工具来解放我们的双手&#xff0c;大脑&#xff0c;眼睛。 为什…

蚂蚁安全科技 Nydus 镜像加速实践

蚂蚁安全科技 Nydus 镜像加速实践 原创 曦栖 金融级分布式架构 文&#xff5c;蚂蚁集团 ZOLOZ 团队 使用全球领先安全科技&#xff0c;为用户和机构提供安全、便捷的安全风控解决方案。 本文 6386 字 阅读 12 分钟 背景简介 ZOLOZ[1]是蚂蚁集团旗下的全球安全风控平台&…

84.qt qml-Sprite精灵、SpriteSequence、ImageParticle使用Sprite精灵动画(三)

在上章我们学习了83.qt qml-初步学习2D粒子影响器(二)_诺谦的博客-CSDN博客 然后还有两个影响器没有学习: 粒子精灵影响器SpriteGoal 粒子组影响器GroupGoal 本章我们便来学习粒子精灵和粒子精灵影响器 ImageParticle通过sprites来设置精灵列表,如下图所示: 所以我们需要…

JVM学习(八):运行时数据区——虚拟机栈(字节码程度深入剖析)

目录 一、概述 1.1 基于栈结构的虚拟机 1.2 栈和堆 二、虚拟机栈&#xff08;Java Virtual Machine Stack&#xff09;详述 2.1 虚拟机栈介绍 2.2 虚拟机栈作用 2.3 虚拟机栈特点 三、栈中常见的异常 3.1 StackOverflowError异常 3.2 OutOfMemoryError异常 四、…

OpenGL学习笔记(一)

文章目录 1. 顶点2. 着色器(Shader) 1. 顶点 OpenGL本质是一个状态机&#xff0c;点作为表示图形最基本的元素&#xff0c;如何告诉OpenGL点的基本信息就是我们要做的事情 1.1VertexArray VertexArray是所有顶点的集合&#xff0c;我们可以将VertexBuffer分成很多组&#xff…