当前位置: 首页 > news >正文

【DP】01背包

算法-01背包


前置知识

  • DP

思路

01背包一般分为两种,不妨叫做价值01背包和判断01背包。

价值01背包

01背包问题是这样的一类问题:给定一个背包的容量 m m m n n n 个物品,每个物品有重量 w w w 和价值 v v v,求不超过背包容量时可以装下的最大价值。
对于这类问题,我们使用DP,设 f i , j f_{i,j} fi,j 为考虑前 i i i 个物品时总重恰好为 j j j 的最大价值和。
容易得到DP方程: f i , j = max ⁡ ( f i − 1 , j , f i − 1 , j − w + v ) f_{i,j}=\max(f_{i-1,j},f_{i-1,j-w}+v) fi,j=max(fi1,j,fi1,jw+v)

判断01背包

思路类似,方程变为 f i , j = f i − 1 , j ∣ f i − 1 , j − w + v f_{i,j}=f_{i-1,j}\mid f_{i-1,j-w}+v fi,j=fi1,jfi1,jw+v 即可


算法参数

  • 时间复杂度: Θ ( n m ) \Theta(nm) Θ(nm)
  • 空间复杂度: Θ ( n m ) \Theta(nm) Θ(nm)

滚动优化

滚动优化是动态规划中最常见的空间优化了。
容易发现在动态转移方程中有 f i , j = max ⁡ ( f i − 1 , j , f i − 1 , j − w + v ) f_{i,j}=\max(f_{i-1,j},f_{i-1,j-w}+v) fi,j=max(fi1,j,fi1,jw+v)
注意到第一维仅仅继承上一轮循环的状态,可以把这一维删掉。
我们注意到每次从前往后枚举 j j j,前面的状态已经被更新了,于是不妨倒过来循环,此时前面的数据还是上一次的结果,拿过来用即可。


算法参数

  • 时间复杂度: Θ ( n m ) \Theta(nm) Θ(nm)
  • 空间复杂度: Θ ( n + m ) \Theta(n+m) Θ(n+m)

实现代码

  • 价值
f[0]=0;
for (int i=1;i<=n;i++)for (int j=m;j>=w[i];j--)f[j]=max(f[j],f[j-w[i]]+v[i]);
  • 判断
f[0]=1;
for (int i=1;i<=n;i++)for (int j=m;j>=w[i];j--)f[j]=f[j]|f[j-w[i]];

练习

  • P1048
  • P1049
  • P1734

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Linux嵌入书学习—数据结构——栈(seqstak)
  • 鸿蒙(HarmonyOS)下拉选择控件
  • CSS实现表格无限轮播
  • Kafka基础概念
  • @NotNull、@NotEmpty 和 @NotBlank 区别
  • 【leetcode 详解】生成特殊数字的最少操作【中等】(C++思路精析)
  • C#中实现Web API的签名验证
  • 24种设计模式介绍与6大设计原则(电子版教程)
  • [Javascript】前端面试基础3【每日学习并更新10】
  • 【iOS】——Block循环引用
  • Java面试题基础
  • JAVA(SpringBoot)对接微信登录
  • docker compose build 怎么才能只构建其中一个服务的镜像
  • 基于微信小程序+SpringBoot+Vue的儿童预防接种预约系统(带1w+文档)
  • 夯实数字经济的“新基建”-基于大数据与区块链技术的新型基础设施
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • CentOS6 编译安装 redis-3.2.3
  • Centos6.8 使用rpm安装mysql5.7
  • isset在php5.6-和php7.0+的一些差异
  • mysql innodb 索引使用指南
  • mysql外键的使用
  • React-flux杂记
  • XForms - 更强大的Form
  • 技术:超级实用的电脑小技巧
  • 配置 PM2 实现代码自动发布
  • 阿里云服务器购买完整流程
  • (03)光刻——半导体电路的绘制
  • (13):Silverlight 2 数据与通信之WebRequest
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (十二)Flink Table API
  • (十六)串口UART
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (转)nsfocus-绿盟科技笔试题目
  • .cfg\.dat\.mak(持续补充)
  • .Family_物联网
  • .NET 5种线程安全集合
  • .Net Core 微服务之Consul(三)-KV存储分布式锁
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .net mvc部分视图
  • .Net OpenCVSharp生成灰度图和二值图
  • .Net 基于MiniExcel的导入功能接口示例
  • .NET/C#⾯试题汇总系列:集合、异常、泛型、LINQ、委托、EF!(完整版)
  • .NET应用UI框架DevExpress XAF v24.1 - 可用性进一步增强
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • /proc/stat文件详解(翻译)
  • @Data注解的作用
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • [Android] 240204批量生成联系人,短信,通话记录的APK
  • [C++随笔录] 红黑树
  • [CISCN2021 Quals]upload(PNG-IDAT块嵌入马)
  • [ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-controller-manager失败