首页 > 其他分享 >动态规划中01背包问题

动态规划中01背包问题

时间:2024-07-13 14:26:33浏览次数:21  
标签:01 weight 元素 value 背包 物品 动态 dp

动态规划中01背包问题:

这记录一下自己的思考和总结:
详细讲解:添加链接描述

这种题目中有两种解题方法

一是二维数组dp[i][j]表示0-i区间背包容量为j的最大价值

那么可以有两个方向推出来dp[i][j]

  • 不放物品i:由dp[i - 1][j]推出,即背包容量为j,里面不放物品i的最大价值,此时dp[i][j]就是dp[i - 1][j]。(其实就是当物品i的重量大于背包j的重量时,物品i无法放进背包中,所以背包内的价值依然和前面相同。
  • 放物品i:由dp[i - 1][j - weight[i]]推出,dp[i - 1][j - weight[i]] 为背包容量为j - weight[i]的时候不放物品i的最大价值,那么dp[i - 1][j - weight[i]] + value[i] (物品i的价值),就是背包放物品i得到的最大价值

所以递归公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);

这里我们获取到的值都是从左边和正上方获取值来更新当前值,所以这里可以从左到右来更新背包的容量,因为之前的值都已经好好的存储好了不会在改变

二是一维数组dp[j]表容量为j的背包,所背的物品价值可以最大为dp[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]);

这里不能正序可以这么理解:

虽然是一维数组,但是性质和二维背包差不多。我们先来理解倒序遍历,从最后一个元素往前看,看到的都是“上一层的元素”然后每遍历到一个元素,就把当前元素赋值成“当前层”的。这样得到的背包,因为每个元素加上的都是上一层的对应的物品value,所以不会重复。

因为二维数组是根据左上元素来求的,一维数组自然就是靠左边来求的。倒序的时候左边元素再刷新前都是上一层的数据,但正序就不一样了,正序的时候,左边的元素刚刚刷新过,也就是左边的元素已经是本层的了,意味着什么 这样会导致一个物品反复加好几次。

标签:01,weight,元素,value,背包,物品,动态,dp
From: https://blog.csdn.net/weixin_44269804/article/details/140399049

相关文章

  • 纪念品(2019CSP-J)
    题目描述    小伟突然获得一种超能力,他知道未来T天N种纪念品每天的价格。某个纪念品的价格是指购买一个该纪念品所需的金币数量,以及卖出一个该纪念品换回的金币数量。    每天,小伟可以进行以下两种交易无限次:任选一个纪念品,若手上有足够金币,以当日价格购买该纪念品;......
  • idea 出现[08S01] 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全
    目录1.问题所示2.原理分析3.解决方法1.问题所示idea配置Database的时候,出现如下问题:Failed  Copy SearchError Troubleshooting[08S01]驱动程序无法通过使用安全套接字层(SSL)加密与SQLServer建立安全连接。错误:“Theserverselectedprotoco......
  • 算法学习笔记(8.3)-(0-1背包问题)
    目录最常见的0-1背包问题:第一步:思考每轮的决策,定义状态,从而得到dp表第二步:找出最优子结构,进而推导出状态转移方程第三步:确定边界条件和状态转移顺序方法一:暴力搜素代码示例:方法二:记忆化搜索时间复杂度取决于子问题数量,也就是O(n*cap)。实现代码如下:方法三:动态规划代......
  • SOEE5010 Research Methods
    SOEE5010ResearchMethodsSummativeAssessmentGuidelinesContentandstructureoftheresearchpaperThefinalassignmentconsistsofa3,000wordresearchpaperanda200wordabstract(3,200wordsintotal)onadaptationtofloodingintheUKthatrepo......
  • day01-springcloud-nacos
    SpringCloud0101概述导入:单体项目-》分布式项目(微服务)02.我们今天学习目标:单体项目-》分布式项目(微服务)众多微服务如何管理、相互调用的注册中心-Eureka和NacosEureka和Nacos对比1.认识微服务随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架......
  • [CISCN2019 华东南赛区]Double Secret 1
    信息收集,加密打开之后只有这一段话,尝试搜索页面,最后找到了/secret让我们传入数值他会给我们加密随便传入一个发现是有加密的,之后我们可以随便输入点东西看看有没有报错页面很亮眼这里其实就是对我们输入参数的一个判断,首先判断你是不是为空,如果是空的参数,则返回一段话,就......
  • [HarekazeCTF2019]encode_and_encode 1
    json绕过,waf绕过打开之后可以直接看到源码<?phperror_reporting(0);if(isset($_GET['source'])){show_source(__FILE__);exit();}functionis_valid($str){$banword=[//nopathtraversal'\.\.',//nostreamwrapper&......
  • [RootersCTF2019]I_<3_Flask 1
    考点,注入点探测,ssti,jinja模板打开题目后可以看到是flask,不难联想到是模板注入,但是我们还是不知道注入点的参数,所以我们可以用arjun去进行探测配置方法pip3installarjunarjun-u网址之后我们先尝试注入{{7*'7'}}可以通过回显判断出是jinjia模板直接上fenjing直接命令......
  • P2482 [SDOI2010] 猪国杀 代码(暂未完成)
    #include<bits/stdc++.h>usingnamespacestd;namespacework{constintmaxPlayerNumber=11;intn,m,top=1;//玩家数,牌堆中的牌数,目前的牌堆顶unordered_map<string,int>transCard;//牌型编号unordered_map<string,int>transRole;//角色编号vector<int>c......
  • 0170-Multiboot2 启动头
    环境Time2022-11-11WSL-Ubuntu22.04QEMU6.2.0NASM2.15.05前言说明参考:https://os.phil-opp.com/multiboot-kernel/目标编写一个符合multiboot2规范的启动文件。multiboot2规范https://www.gnu.org/software/grub/manual/multiboot2/multiboot.html#Header-tag......