动态规划之详解01背包和完全背包

2023-11-14

  一、总述

在动态规划中,01背包和完全背包可以说是动态规划最典型的应用了。先介绍一下定义:

动态规划:英⽂:Dynamic Programming,简称DP,动态规划是一种多阶段决策最优解模型的思想,如果某⼀问题有很多重叠⼦问题,使⽤动态规划 是最有效的。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些字问题的解得到原问题的解。

01背包:有N件物品和⼀个最多能被重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每 件物品只能⽤⼀次,求解将哪些物品装⼊背包⾥物品价值总和最⼤。

完全背包:有N件物品和⼀个最多能被重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每 件物品可以无限使用,求解将哪些物品装⼊背包⾥物品价值总和最⼤。

二、01背包详解

题目:有N件物品和⼀个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每 件物品只能⽤⼀次,求解将哪些物品装⼊背包⾥物品价值总和最⼤。

解释:我们知道动态规划就是把大问题划分为小问题,先求出小问题的解,然后在通过小问题的解求出大问题的解,所以我们先要用一个数据结构来保存小问题求出的解,这样才好根据保存的解求出大问题的解,动态规划90%都是用数组来保存解。根据题目可以知道01背包有二个维度,一个维度是物品,另一个维度是背包重量,所以我们应该定义一个二维数组dp[i][j],dp[i][j]的含义是:从下标为[0-i]的物品⾥任意取,放进容量为j的背包,价值总和最⼤是多少。根据第一可知,要想知道dp[i][j](这个数组中的每个位置都是放的在当前物品树是i,容量是j时的最大值),那就得知道dp[i][j]之前的状态,那怎么从dp[i][j]之前的状态推出dp[i][j]呢,根据定义可知就是我放不放当前第i个物品到背包中去不,那我们就要考虑放进去的到的价值最大,还是不放进去的到的价值最大,当放进去时dp[i-1][j-weight[i]]+value[i],当不放进去时dp[i-1][j],二者取最大的即dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i])。根据递推公式可知,i一定要从1开始才行,才能确保递推公式中的i-1大于0,所以我们因该要初始化一下当i为0时,dp[0][j]的值的大小。dp[0][j]代表当只有一个物品时容量为j时,可以得到的最大价值,所以for (int j = 0 ; j < weight[0]; j++) {  dp[0][j] = 0; }。接下来看源码分析:

java代码:
 //weight[i]:物品i的重量
// value[i]:物品i的价值
// w:背包的容量
 public int zeroAndOne(int[] weight,int[] value,int w){

     int[][] dp=new int[value.length][w+1];//dp[i][j]:在前i件商品中得到最大容量为j的物品的最大价值。
     for(int j=w;j>=weight[0];j--){
        dp[0][j]=value[0];//初始化dp[0][j]
     }
     
     for(int i=1;i<value.length;i++){//遍历物品
        for(int j=1;j<=w;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[value.length-1][w];
}

三、完全背包详解

题目:有N件物品和⼀个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件 物品都有⽆限个(也就是可以放⼊背包多次),求解将哪些物品装⼊背包⾥物品价值总和最⼤。

解释:完全背包和01背包问题唯⼀不同的地⽅就是,每种物品有⽆限件。因此他的dp[i][j]的由来就不同了,当放进去时dp[i-1][j-weight[i]]+value[i],当不放进去时dp[i-1][j],二者取最大的即dp[i][j] = Math.max(dp[i - 1][j], dp[i ][j - weight[i]] + value[i])。

代码如下:

java代码:
 //weight[i]:物品i的重量
// value[i]:物品i的价值
// w:背包的容量
 public int zeroAndOne(int[] weight,int[] value,int w){

     int[][] dp=new int[value.length][w+1];//dp[i][j]:在前i件商品中得到最大容量为j的物品的最大价值。
     for(int j=w;j>=weight[0];j--){
        dp[0][j]=value[0];//初始化dp[0][j]
     }
     
     for(int i=1;i<value.length;i++){//遍历物品
        for(int j=1;j<=w;j++){//遍历背包容量
            if(weight[i]>j){
               dp[i][j]=dp[i-1][j];
            }else{//注意下面的dp[i]不是dp[i-1]了,因为物品无限个,所以我们可以在dp[i][j之前]的 
                  //位置拿数据了。
               dp[i][j]=Math.max(dp[i-1][j],dp[i][j-weight[i]]+value[i]);
            }
         }
     }
   return dp[value.length-1][w];
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态规划之详解01背包和完全背包 的相关文章

随机推荐

  • CSS之背景样式及边框样式

    1 背景样式 常用属性 background color 背景颜色 background image 背景图片 background repeat 背景图片的平铺方式 background position 背景图片的位置 backgrou
  • 加密、解密、加签、验签专题

    首先明确几个名词 加密 发送方利用接收方的公钥对要发送的明文进行加密 解密 接受方利用自己的私钥进行解密 公钥和私钥配对的 用公钥加密的文件 只有对应的私钥才能解密 当然也可以反过来 用私钥加密 用对应的公钥进行解密 签名 发送方用一个哈希
  • 智能家居系统中网关与服务器如何连接?

    原文点击打开链接 在新型智能家居系统中 家庭网关将取代PC机作为家庭控制中心 传统客户端 服务器模式不能保持家庭网关与远程服务器实时连接 基于百万级的家庭网关与服务器保持长连接的目的 采用主从服务器框架进行负载均衡 心跳机制保障网关与服务器
  • 容器安全最佳实践入门

    作者 Cloudberry 译者 王者 策划 万佳 保证容器安全是一项复杂的任务 这个问题域很广 面对大量的检查清单和最佳实践 你很难确定采用哪个解决方案 所以 如果你要实现容器安全策略 应该从哪里开始呢 我建议从最基本的开始 理解容器安全
  • v-model.number的坑,自动清除小数点后的0

  • Android7.0 获取蓝牙设备电量

    参考http blog csdn net jcxxxxx55 article details 52847291 locationNum 4 fps 1 1 修改 HeadsetStateMachine packages apps Bluet
  • 有趣的数据结构算法16——线索二叉树的构建

    有趣的数据结构算法16 线索二叉树的构建 什么是线索二叉树 线索二叉树的实现形式 线索二叉树的代码实现 线索二叉树的初始化 线索的串联 全部实现代码 GITHUB下载连接 深度遍历不仅仅有递归的方法噢 还有通过建立线索二叉树进行遍历的方法
  • 在pycharm上安装Tensorflow1.13 win10

    Tensorflow安装教程 清明回家就折腾了几天的tensorflow 我是使用pycharm安装的 所以下面基于pycharm进行安装 tensorflow1 13 0基础配置 python3 7 cuda10 0 适合cuda的cuD
  • 《数字图像处理》笔记—灰度变换

    3 1 背景 本章主要讲解空间域的图像处理方法 直接对图像中的像素进行操作 主要包括 灰度变换和空间滤波 灰度变换是对图像的各个像素进行操作 空间滤波是对每个像素的邻域进行操作 3 1 1 灰度变换和空间滤波基础 空间域处理可以表达为 邻域
  • 漫画:排序算法系列 第一讲(利用插入算法思想解题)

    在本系列中 将为大家讲解排序算法相关内容 同时 由于网上排序相关的教程太多了 我会尽可能的讲解一些不一样的内容 而不是按照 排序讲解 标准Titile 什么 十大排序算法 经典排序算法 排序算法必知必会 之类的一个一个来进行讲解 所以 如果
  • JDK1.8下载步骤

    JDK概述 JDK是 Java 语言的软件开发工具包 主要用于移动设备 嵌入式设备上的java应用程序 JDK是整个java开发的核心 它包含了 JAVA开发工具 jdk bin 基础开发库 jdk jre lib rt jar 基础开发库
  • windows11测评

    微软在今年6月正式发布了新一代Windows 11操作系统 作为微软近6年来首次推出新的Windows操作系统 Windows 11带来了众多新功能和新特性 例如全新应用商店 新版右键菜单 分离式通知中心 优化的设置面板以及UI界面的重新设
  • 汽车零配件行业MES规划与落地

    汽车零部件行业作为汽车整车行业的上游 是汽车工业发展的基础 汽车制造业的竞争很大程度上也是其零部件产业水平的竞争 近年来 国内汽车零部件企业通过技术引进 合资合作 自主发展 多元化投资等相关措施 在装备水平 制造技术 产品质量 管理水平等方
  • nextcloud 安装教程 windows 中nextcloud 安装方法

    一 准备工作 1 windows server 中可以用WM 虚拟机 再安装docker 虚拟机磁盘只要20G就够了 云盘数据可以映射到其它盘中 2 在虚拟机中设置好共享文件夹名称为nextcloud 用来存放云盘数据 所以请选一个大一点的
  • 【C++】3、排序算法 C++ 实现

    文章目录 排序算法程序 1 冒泡排序 2 直接插入排序 3 希尔排序 4 快速排序 5 总结 排序算法程序 1 冒泡排序 通过对相邻数据的元素进行交换 逐步将待排序序列排成有序序列的过程 如升序排列 扫描整个待排序序列 非整个序列 不扫描已
  • 关系数据库中表示层级结构

    Managing Hierarchical Data in MySQL What are the options for storing hierarchical data in a relational database Trees in
  • 微信小程序地图导航源码、地图导航小程序源码

    最近研究了微信小程序地图功能 编写了地图导航功能的Demo 文章尾部附有下载地址 1 用户定位功能 用户同意小程序获取位置权限 并定位用户当前位置 2 选择目的地 并开始自动导航功能 2 选择交通工具 显示里程数 及显示相似目的地功能 地图
  • JSP页面分页显示数据

    效果如上图所示 最多显示10条 完整jsp和后台代码如下
  • Meetup回顾

    近期 社区组织了专场线上Meetup 分享了v3 0在2022年的研发路线及开发部署方式 直播间讨论十分热烈 我们把一些开发者们比较关心的问题进行了梳理 整理成这一篇关于v3 0的常见问题和解答 供大家学习参考 Q 目前v3 0性能是多少
  • 动态规划之详解01背包和完全背包

    一 总述 在动态规划中 01背包和完全背包可以说是动态规划最典型的应用了 先介绍一下定义 动态规划 英 Dynamic Programming 简称DP 动态规划是一种多阶段决策最优解模型的思想 如果某 问题有很多重叠 问题 使 动态规划