首页 > 其他分享 >动态规划之泛化物品

动态规划之泛化物品

时间:2023-06-30 21:12:21浏览次数:34  
标签:费用 背包 泛化 .. 物品 动态 函数

定义

考虑这样一种物品,它并没有固定的费用和价值,而是它的价值随着你分配给它的费用而变化。这就是泛化物品的概念。

更严格的定义之。在背包容量为V的背包问题中,泛化物品是一个定义域为0..V中的整数的函数h,当分配给它的费用为v时,能得到的价值就是h(v)。

这个定义有一点点抽象,另一种理解是一个泛化物品就是一个数组h[0..V],给它费用v,可得到价值h[V]。

一个费用为c价值为w的物品,如果它是01背包中的物品,那么把它看成泛化物品,它就是除了h(c)=w其它函数值都为0的一个函数。如果它是完全背包中的物品,那么它可以看成这样一个函数,仅当v被c整除时有h(v)=v/cw,其它函数值均为0。如果它是多重背包中重复次数最多为n的物品,那么它对应的泛化物品的函数有h(v)=v/cw仅当v被c整除且v/c<=n,其它情况函数值均为0。

一个物品组可以看作一个泛化物品h。对于一个0..V中的v,若物品组中不存在费用为v的的物品,则h(v)=0,否则h(v)为所有费用为v的物品的最大价值。P07中每个主件及其附件集合等价于一个物品组,自然也可看作一个泛化物品。

泛化物品的和

如果面对两个泛化物品h和l,要用给定的费用从这两个泛化物品中得到最大的价值,怎么求呢?事实上,对于一个给定的费用v,只需枚举将这个费用如何分配给两个泛化物品就可以了。同样的,对于0..V的每一个整数v,可以求得费用v分配到h和l中的最大价值f(v)。也即

f(v)=max{h(k)+l(v-k)|0<=k<=v}

可以看到,f也是一个由泛化物品h和l决定的定义域为0..V的函数,也就是说,f是一个由泛化物品h和l决定的泛化物品。

由此可以定义泛化物品的和:h、l都是泛化物品,若泛化物品f满足以上关系式,则称f是h与l的和。这个运算的时间复杂度取决于背包的容量,是O(V^2)。

泛化物品的定义表明:在一个背包问题中,若将两个泛化物品代以它们的和,不影响问题的答案。事实上,对于其中的物品都是泛化物品的背包问题,求它的答案的过程也就是求所有这些泛化物品之和的过程。设此和为s,则答案就是s[0..V]中的最大值。

背包问题的泛化物品

一个背包问题中,可能会给出很多条件,包括每种物品的费用、价值等属性,物品之间的分组、依赖等关系等。但肯定能将问题对应于某个泛化物品。也就是说,给定了所有条件以后,就可以对每个非负整数v求得:若背包容量为v,将物品装入背包可得到的最大价值是多少,这可以认为是定义在非负整数集上的一件泛化物品。这个泛化物品——或者说问题所对应的一个定义域为非负整数的函数——包含了关于问题本身的高度浓缩的信息。一般而言,求得这个泛化物品的一个子域(例如0..V)的值之后,就可以根据这个函数的取值得到背包问题的最终答案。

综上所述,一般而言,求解背包问题,即求解这个问题所对应的一个函数,即该问题的泛化物品。而求解某个泛化物品的一种方法就是将它表示为若干泛化物品的和然后求之。

小结

本讲可以说都是我自己的原创思想。具体来说,是我在学习函数式编程的 Scheme 语言时,用函数编程的眼光审视各类背包问题得出的理论。这一讲真的很抽象,也许在“模型的抽象程度”这一方面已经超出了NOIP的要求,所以暂且看不懂也没关系。相信随着你的OI之路逐渐延伸,有一天你会理解的。

我想说:“思考”是一个OIer最重要的品质。简单的问题,深入思考以后,也能发现更多。

标签:费用,背包,泛化,..,物品,动态,函数
From: https://www.cnblogs.com/shoshana-kong/p/17517825.html

相关文章

  • 动态规划之有依赖的背包问题
    简化的问题这种背包问题的物品间存在某种“依赖”的关系。也就是说,i依赖于j,表示若选物品i,则必须选物品j。为了简化起见,我们先设没有某个物品既依赖于别的物品,又被别的物品所依赖;另外,没有某件物品同时依赖多件物品。算法这个问题由NOIP2006金明的预算方案一题扩展而来。遵从该题......
  • 动态规划之分组的背包问题
    问题有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。算法这个问题变成了每组物品有若干种策略:是选择本组的某一件,还是......
  • 动态规划之混合三种背包问题
    问题如果将P01、P02、P03混合起来。也就是说,有的物品只可以取一次(01背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包)。应该怎么求解呢?01背包与完全背包的混合考虑到在P01和P02中给出的伪代码只有一处不同,故如果只有两类物品:一类物品只能取一次,另一类......
  • vue:<img>动态绑定的路径无法解析问题
    问题我们引用图片,正常的静态img图片是这么引用的<imgsrc="@/assets/img/icoms/people.png"/>没问题,只要路径正确在vue中动态绑定路径:src<img:src="@/assets/img/icoms/people.png"/>发现图片根本加载不出来,因为:src根本不能解析@/assets/img/icoms/people.png解决......
  • 动态规划01
    动态规划核心要义这一步的数据依据上一步或者上两步的数据动态规划五部确定dp数组(dptable)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组动态规划第一题斐波那契数列dp[i]表示第i个数列的值递推公式已经给出f(n)=f(n-1)+f(n-2)初始化已......
  • 带负载转矩观测器的永磁同步电动机控制方法。 负载转矩观测器无论是对静态的负载变化
    带负载转矩观测器的永磁同步电动机控制方法。负载转矩观测器无论是对静态的负载变化还是动态的负载变化都有很好的观测效果。一方面可以较好的跟踪负载转矩的变化,另一方面可以作为前馈减小电机转速的波动。原创文章,转载请说明出处,资料来源:http://imgcs.cn/5c/672148599043.html......
  • day114- 动态sql
    动态SQL解决拼接SQL语句字符串时的问题。if标签if标签可通过test属性的表达式进行判断,若表达式的结果为true,则标签中的内容会执行;反之标签中的内容不会执行<!--List<Emp>getEmpByCondition(Empemp);--><selectid="getEmpByCondition"resultType="com.gu.mybatis.poj......
  • jdk动态代理
    一、Class.forName的作用classc=Class.forName(“com.xxx.Example”); 返回的是一个类的实例factory=(ExampleInterface)c.newInstance();  newInstance之前必须保证类被加载了jvm在装载类时会执行类的静态代码段,要记住静态代码是和class绑定的,class装载成功就表示执行......
  • 动态规划十大经典案例
    动态规划十大经典案例动态规划是一种常用的算法思想,它可以解决很多优化问题,比如求最大值、最小值、最长子序列等。动态规划的基本思想是把一个复杂的问题分解成若干个子问题,然后从最简单的子问题开始,逐步推导出更大的子问题的解,最终得到原问题的解。动态规划通常需要定义一个状态......
  • leetcode动态规划-
    什么是动态规划动态规划的定义和特点动态规划的基本思想和步骤动态规划的分类和常见问题线性动态规划最长公共子序列最长递增子序列最大子数组和区间动态规划矩阵链乘法括号化问题背包动态规划0-1背包问题完全背包问题多重背包问题状态压缩动态规划......