【简化的问题】

这种背包问题的物品间存在某种“依赖”的关系,也就是说,i依赖于j,表示若选物品i,则必须选物品j。

为了简化起见,我们先设没有某个物品既依赖于别的物品,又被别的物品所依赖,另外,没有某件物品同时依赖多件物品。

【算法】

将不依赖于别的物品的物品称为“主件”,依赖于某主件的物品称为“附件”,所有的物品由若干主件和依赖于每个主件的一个附件集合组成。

按照背包问题的一般思路,仅考虑一个主件和它的附件集合。可是,可用的策略非常多,包括:一个也不选,仅选择主件,选择主件后再选择一个附件,选择主件后再选择两个附件……无法用状态转移方程来表示如此多的策略。(事实上,设有n个附件,则策略有2^n+1个,为指数级。)

考虑到所有这些策略都是互斥的(也就是说,你只能选择一种策略),所以一个主件和它的附件集合实际上对应于P06中的一个物品组,每个选择了主件又选择了若干个附件的策略对应于这个物品组中的一个物品,其体积和价值都是这个策略中的物品的值的和。但仅仅是这一步转化并不能给出一个好的算法,因为物品组中的物品还是像原问题的策略一样多。

考虑P06: 可以对每组中的物品应用P02中“一个简单有效的优化”。

这提示我们,对于一个物品组中的物品,所有体积相同的物品只留一个价值最大的,不影响结果。所以,我们可以对主件i的“附件集合”先进行一次01背包,得到体积依次为0..V-w[i]所有这些值时相应的最大价值f'[0..V-w[i]]。那么这个主件及它的附件集合相当于V-w[i]+1个物品的物品组,其中体积为w[i]+k的物品的价值为f'[k]+c[i]。

也就是说原来指数级的策略中有很多策略都是冗余的,通过一次01背包后,将主件i转化为V-w[i]+1个物品的物品组,就可以直接应用P06的算法解决问题了。

【较一般的问题】

更一般的问题是:依赖关系以图论中“森林”(即多叉树的集合)的形式给出,也就是说,主件的附件仍然可以具有自己的附件集合,限制只是每个物品最多只依赖于一个物品(只有一个主件)且不出现循环依赖。

解决这个问题仍然可以用将每个主件及其附件集合转化为物品组的方式。唯一不同的是,由于附件可能还有附件,就不能将每个附件都看作一个一般的01背包中的物品了。若这个附件也有附件集合,则它必定要被先转化为物品组,然后用分组的背包问题解出主件及其附件集合所对应的附件组中各个费用的附件所对应的价值。

事实上,这是一种树形DP,其特点是每个父节点都需要对它的各个儿子的属性进行一次DP以求得自己的相关属性。

这已经触及到了“泛化物品”的思想,看完P08后,你会发现这个“依赖关系树”每一个子树都等价于一件泛化物品,求某节点为根的子树对应的泛化物品相当于求其所有儿子的对应的泛化物品之和。

动态规划 —— 背包问题 P07 —— 有依赖背包相关推荐

  1. 动态规划 —— 背包问题 P08 —— 泛化物品背包

    [定义] 泛化物品的概念:有这样一种物品,它并没有固定的费用和价值,而是它的价值随着你分配给它的费用而变化. 更严格的定义:在背包容量为V的背包中,泛化物品是一个定义域为0..V中的整数的函数h,当分 ...

  2. 动态规划/背包问题总结/小结——01背包、完全背包

    文章目录 前言 动态规划五步法 01背包模型 完全背包 总结 前言 背包问题也属于动态规划问题. 动态规划就是将复杂的大问题转化为一个小问题,然后将小问题转化为更小的容易求解的问题:通过将最小的容易求 ...

  3. 动态规划——背包问题整理(01背包+完全背包)

    1.引言 背包问题简单描述,其实就是有一堆物品同时具有一定价值和重量,现有一个背包可以承受最大重量m,那么要怎么选择在不超过背包最大重量的前提下,使背包中选择的物品价值最大. 最常见的背包问题又可以分 ...

  4. 动态规划 —— 背包问题 P05 —— 二维背包

    [问题] 对于每件物品,具有两种不同的体积,选择这件物品必须同时付出这两种代价,对于每种代价都有一个可付出的最大值(背包容量). 问:怎样选择物品可以得到最大的价值? 设:这两种代价分别为代价1和代价 ...

  5. 动态规划 —— 背包问题

    [概述] 背包问题(Knapsack problem)是一种组合优化的NP完全问题. 问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最 ...

  6. 动态规划——背包问题(01背包问题)

    动态规划--背包问题(01背包问题) 01背包问题(求最大价值): 问题优化 01背包问题(求方案数): 动态规划--背包问题(01背包问题) 01背包问题(求最大价值): 有N件物品和一个最多能背重 ...

  7. 依赖背包dp NOIP2006 vijos 1313 金明的预算方案

    依赖背包: 简化的问题 这种背包问题的物品间存在某种"依赖"的关系.也就是说,物品i依赖于物品j,表示若选物品i,则必须选物品j.为了简化起见,我们先设没有某个物品既依赖于别的物品 ...

  8. 第45期:动态规划-背包问题

    目录 1. 01背包 1. 2. 01背包问题 - AcWing题库 2.完全背包(无限背包) 1. 疯狂的采药 - 洛谷 3.多重背包 二进制优化多重背包 单调队列优化多重背包 4. 树形背包 1. ...

  9. 动态规划背包问题优化空间复杂度——滚动数组

    动态规划背包问题优化空间复杂度--滚动数组 背包问题 空间复杂度优化 Java代码 链接:代码随想录背包问题 背包问题   背包问题是动态规划中基本的问题,我们考虑下面的简单问题:   假设背包容量为 ...

最新文章

  1. java判斷素數,算法改進 | java語言中判斷素數
  2. 3D中OBJ文件格式详解
  3. 【干货分享】云服务平台的架构及优势(上)
  4. 拟真机器人拯救者奖励_冒险岛新版本拟真机器人什么样 新版本攻略
  5. git 拉取远程分之到本地
  6. ES6的新特性(8)——数组的扩展
  7. CCO x Hologres:实时数仓高可用架构再次升级,双11大规模落地
  8. [LeetCode] Minimum Window Substring 散列映射问题
  9. 夺命雷公狗---无限级分类NO2
  10. 项目计划书——书写模板
  11. NAT技术与代理服务器详解
  12. 依米花播放器仿绚丽彩虹播放器程序
  13. 计算机视频DVI接口,HDMI、DVI 电脑为什么会有这么多种视频接口?
  14. 百度云服务器BCC centos实例搭建vsftpd站点
  15. 并发编程系列之一:锁的意义
  16. 有限差分法和有限体积法的区别
  17. 今天我们怎样学软件技术,怎样教软件课程?
  18. 冰点与沸点—— 我的购物记
  19. Ubuntu 几个常用的更新命令
  20. eis电子防抖好还是光学防抖好_OTA1是120HZ,OTA2是全场景视频防抖技术,下次会是什么?...

热门文章

  1. 零基础入门Python I/O:从print函数开始
  2. atheros有线网卡LINUX驱动,请问有知道atheros无线网卡Linux驱动官方下载地址是什么吗?...
  3. 简历准备及面试技巧,你应该知道的一切
  4. Spring Boot 2.3.3 稳定版发布!修复了这18个Bug!!
  5. 怎么样才算是精通 JavaScript?
  6. MiniDao_1.6-SNAPSHOT 版本发布,轻量级Java持久化框架
  7. 专题开发十二:JEECG微云快速开发平台-基础用户权限
  8. JEECG Framework 3.4.3 GA 版本发布
  9. (转)数据库查询速度慢的原因
  10. Lucy-Richardson加速算法以及PSF计算MATLAB代码