1、P01: 01背包问题题目有N件物品和一个容量为V的背包。第i件物品的费用是ci,价值是wi。求解将哪些物品装入背包可使价值总和最大。基本思路这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即fiv表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:fiv=maxfi-1v,fi-1v-ci+wi这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的。所以有必要将它详细解释一下:“将前i件物品放入容量为v的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i-1件物品的问题。如果不
2、放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”,价值为fi-1v;如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-ci的背包中”,此时能获得的最大价值就是fi-1v-ci再加上通过放入第i件物品获得的价值wi。优化空间复 以上方 的时间和空间复 为O(VN),其中时间复 不能再优化 , 空间复 可以优化 O。考虑上 的基本思路如 , 定是有一个 i=1N,每 出来 fi0V的所有值。那么,如果只用一个 f0V,能不能 第i fv中表示的就是定义的状态fivfiv是由fi-1v和fi-1v-ci个子问题currency1来,能 “fiv时(即“第i 中
3、fv时)能得 fi-1v和fi-1v-ci的值 上,这要求“每 中以v=V0的fiflfv,这 能 fv时fv-ci 的是状态fi-1v-ci的值。 如下:for i=1Nfor v=V0fv=maxfv,fv-ci+wi;其中的fv=maxfv,fv-ci一恰就相的转移方程fiv=maxfi-1v,fi-1v-ci,”为 “的fv-ci就相来的fi-1v-ci。如果将v的 fifl上 的fl fifl的 ,那么则 fiv由fiv-ci,本题不, 它 是一个重要的背包问题P02最的解方 , 只用一 解01背包问题是必要的。 上,使用一 解01背包的程fl“ 用 ,所以这 出一个 一件01背包中
4、的物品过程,以 的 中 用不加 。过程ZeroOnePack,表示 一件01背包中的物品,个 cost weight 表 这件物品的费用和价值。procedure ZeroOnePack(cost,weight)for v=Vcostfv=maxfv,fv-cost+weight这个过程 的 前 出的 有所不。前 的示 程flv=V0是为 “程fl中 每个状态都 方程求解 , 不必要的思 复 。currency1这 的过程 ,就可以加入优化。费用为cost的物品不 状态f0cost-1,这是的。有 这个过程以 ,01背包问题的 就可以这 :for i=1NZeroOnePack(ci,wi);
5、化的细 问题(有 的 ) 的求最优解的背包问题题目中, 上有种不相的问 。有的题目要求“恰装背包”时的最优解,有的题目则 有要求必 背包装。一种区 这种问 的 方 是“ 化的时候有所不。如果是第一种问 ,要求恰装背包,那么“ 化时除 f0为0其它f1V 设为-,这 就可以 最终得 的fN是一种恰装背包的最优解。如果 有要求必 背包装,currency1是只希望价格尽量大, 化时 将f0V全部设为0。为什么可以这 解: 化的f 上就是“ 有任 物品可以放入背包时的合 状态。如果要求背包恰装,那么此时只有容量为0的背包可能价值为0的nothing“恰装”,其它容量的背包有合 的解,属未定义的状态,
6、它的值就都 是- 。如果背包 非必 装,那么任 容量的背包都有一个合 解“什么都不装”,这个解的价值为0,所以 时状态的值就全部为0 。这个小 完全可以广 其它类型的背包问题, 就不再对进行状态转移之前的 化进行 解。一个常 优化前 的 中有for v=V1,可以将这个 的下限进行 进。由只需要最 fv的值,倒前一个物品,其 只要道fv-cn即可。以此类,对以第j个背包,其 只需要道 fv-sumcjn即可,即 中的for i=1Nfor v=V0可以 for i=1nbound=maxV-sumcin,ci/累积效 前效 的比较for v=Vbound这对V比较大时是有用的。小 01背包问题
7、是最基本的背包问题,它包含 背包问题中设计状态 方程的最基本思想,外, 的类型的背包问题往往可以转换01背包问题求解。一定要仔细 上 基本思路的得出方 ,状态转移方程的义,以及最 怎 优化的空间复 。P02: 完全背包问题题目有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是ci,价值是wi。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。基本思路这个问题非常类似01背包问题,所不的是每种物品有无限件。就是每种物品的角 考虑,它相关的策略 非取或不取种,currency1是有取0件 取1件 取2件等很 种。如果仍 解01背包时的思路,令fiv
8、表示前i种物品恰放入一个容量为v的背包的最大权值。仍可以 每种物品不的策略出状态转移方程,像这 :fiv=maxfi-1v-k*ci+k*wi|0=wj,则将物品j去掉,不用考虑。这个优化的正确性:任 情况下都可将价值小费用高得j换物美价廉的i,得 至少不更差的方 。对随机生的 据,这个方 往往大大减少物品的件 ,currency1加快速 。currency1这个 不能 善最坏情况的复 ,”为有可能特 设计的 据可以一件物品去不掉。这个优化可以单的O(N2)地 ,一般都可以承受。外,针对背包问题currency1言,比较不错的一种方 是:首 将费用大V的物品去掉, 使用类似计 排fl的做 ,计
9、 出费用相的物品中价值最高的是哪个,可以O(V+N)地完这个优化。这个不重要的过程就不 出 ,希望你能独立思考出 或程fl。转化为01背包问题求解01背包问题是最基本的背包问题,那么可以考虑 完全背包问题转化为01背包问题来解。最单的想 是,考虑 第i种物品最 选V/ci件,是可以 第i种物品转化为V/ci件费用及价值 不变的物品, 求解这个01背包问题。这 完全 有 进基本思路的时间复 , 这毕竟 将完全背包问题转化为01背包问题的思路:将一种物品拆 件物品。更高效的转化方 是: 第i种物品拆费用为ci*2k 价值为wi*2k的若干件物品,其中k足ci*2k0的最大 。 如,如果ni为13,
10、就将这种物品系 为1,2,4,6的 件物品。的这几件物品的系 和为ni,表 不可能取 ni件的第i种物品。外这种方 能 对0ni间的每一个 , 可以用若干个系 的和表示,这个 可以02k-1和2kni 来 论得出, 不 ,希望你自己思考 试一下。这 就将第i种物品 O(log ni)种物品,将问题转化为 复 为O(V*log ni)的01背包问题,是很大的 进。下 出O(log amount)时间 一件 重背包中物品的过程,其中amount表示物品的 量:procedure MultiplePack(cost,weight,amount)if cost*amount=VCompletePack
11、(cost,weight)returninteger k=1while k0)if(giv=0)print “未选第i项物品“else if(giv=1)print “选 第i项物品“v=v-ci外,采用方程的前一项或 一项可以“输出方 的过程中据fiv的值 时地求出来,即不纪录g ,将上 中的giv=0 fiv=fi-1v,giv=1 fiv=fi-1v-ci+wi可。输出字典fl最小的最优方 这 “字典fl最小”的思是1N号物品的选择方 排 出来以 字典fl最小。以输出01背包最小字典fl的方 为 。一般currency1言,求一个字典fl最小的最优方 ,只需要“转移时 策略。首 ,子问题
12、的定义要略 一些。 ,如果“一个选 物品1的最优方 ,那么 一定包含物品1,问题转化为一个背包容量为v-c1,物品为2N的子问题。反之,如果 不包含物品1,则转化背包容量仍为V,物品为2N的子问题。不管 怎 ,子问题的物品都是以iNcurrency1非前所的1i的形式来定义的,所以状态的定义和转移方程都需要 一下。 更易的方 是 物品fl排 一下,以下 物品 fl排 来叙。“这种情况下,可以 前 典的状态转移方程来求值,只是输出方 的时候要 :N 1输入时,如果fiv=fi-1i-v及fiv=fi-1f-ci+wi时立, (即选择 物品i)来输出方 。求方 总 对一个 定 背包容量 物品费用
13、物品间相 关系( 依 等)的背包问题,除 再 定每个物品的价值 求可得 的最大价值外,还可以得 装背包或将背包装至 一定容量的方 总 。对一个 定 背包容量 物品费用 物品间相 关系( 依 等)的背包问题,除 再 定每个物品的价值 求可得 的最大价值外,还可以得 装背包或将背包装至 一定容量的方 总 。对这类 变问 的问题,一般只需将状态转移方程中的max sum即可。 如若每件物品 是完全背包中的物品,转移方程即为fiv=sumfi-1v,fiv-ci件f00=1。 上,这 做可行的”“状态转移方程 考察 所有可能的背包 方。最优方 的总 这 的最优方 是物品总价值最大的方 。以01背包为
14、。合求最大总价值和方 总 个问题的思路,最优方 的总 可以这 求:fiv义前,giv表示这个子问题的最优方 的总 ,则“求fiv的时求giv的 如下:for i=1Nfor v=0Vfiv=maxfi-1v,fi-1v-ci+wigiv=0if(fiv=fi-1v)inc(giv,gi-1v)if(fiv=fi-1v-ci+wi)inc(giv,gi-1v-ci)求 优解 第K优解对求 优解 第K优解类的问题,如果相 的最优解问题能出状态转移方程 用动态规 解,那么求 优解往往可以相的复 解,第K优解则比求最优解的复 上 一个系 K。其基本思想是将每个状态都表示有fl ,将状态转移方程中的ma
15、x/min转化有fl 的合 。这仍以01背包为 解一下。首 01背包求最优解的状态转移方程:fiv=maxfi-1v,fi-1v-ci+wi如果要求第K优解,那么状态fiv就 是一个大小为K的 fiv1K。其中fivk表示前i个物品 背包大小为v时,第k优解的值。“fiv是一个大小为K的 ”这一,熟悉C语言的可能比较 解,或 可以单地 解为“来的方程中加 一 。fiv1K这K个 是由大 小排 的,所以 它认为是一个有fl 。 方程就可以解释为:fiv这个有fl是由fi-1v和fi-1v-ci+wi这个有fl 合 得 的。有fl fi-1v即fi-1v1K,fi-1v-ci+wi则 解为“fi-
16、1v-ci1K的每个 上加上wi 得 的有fl 。合 这个有fl 将 果的前K项储 fiv1K中的复 是O(K)。最 的 是fNVK。总的复 是O(VNK)。为什么这个方 正确 上,一个正确的状态转移方程的求解过程遍历 所有可用的策略,就覆盖 问题的所有方 。只不过由是求最优解,所以其它“任 一个策略上达不 最优的方 都忽略 。如果 每个状态表示一个大小为K的 , “这个中有fl的 状态可取 的前K个最优值。那么,对任个状态的max运 等价个由大 小的有fl 的合 。外还要 题目对“第K优解”的定义,将策略不 权值相的个方 是 一个解还是不的解。如果是前 ,则 护有fl 时要 的 有重复的。小
17、 ,这 不可能穷尽背包类动态规 问题所有的问 。 至还“一类将背包类动态规 问题其它 ( 如 论 图论) 合来的问题,“这篇论背包问题的专中不论及。 只要 刻 前所有类的背包问题的思路和状态转移方程, 其它的变形问 ,只要题目 还属NOIP, 不 想出 。P11: 背包问题的搜索解 单的 搜对01背包问题,单的 搜的复 是O(2N)。就是枚举出所有2N种将物品放入背包的方 ,最优解。搜索的剪枝基本的剪枝方 不外乎可行性剪枝或最优性剪枝。可行性剪枝即判断 前的搜索路径搜下去能 一个可行解, 如:若将剩下所有物品都放入背包仍无 将背包(设题目要求必 将背包),则剪枝。最优性剪枝即判断 前的搜索路径
18、搜下去能 一个最优解, 如:若加上剩下所有物品的权值无 得 比前得 的最优解更优的解,则剪枝。搜索的fifl“搜索中,可以认为fifl靠前的物品优 考虑。所以用贪心的思想,将更有可能出 “ 果中的物品的fifl提前,可以较快地得出贪心地较优解,更有最优性剪枝。所以,可以考虑将 “性价比”(权值/费用)来排 搜索fifl。一方 ,若将费用较大的物品排 “前 ,可以较快地填背包,有可行性剪枝。最 一种可以考虑的方 是:“ 搜索前将输入件中 定的物品的fifl随机打乱。这 可以 命题设置的陷阱。以上 种定搜索fifl的方 很 哪种更, 上每种方 都有适用的题目和 据,有可能将它“ 种程 上fl合使用
19、。子和问题子和问题是一个NP-Complete问题,前的(加权的)01背包问题 不相。 定一个 的合S和一个 X,问是“S的一个子足其中所有元素的和为X。这个问题有一个时间复 为O(2(N/2)的较高效的搜索 ,其中N是合S的大小。第一 思想是 。将合S 个子S1和S2,它的大小都是N/2。对S1和S2, 枚举出它所有的2(N/2)个子和, 种支持查的 据 构中, 如hash set。 就要将部 果合 ,是有和为X的S的子。 上,对S1的 个和为X1的子,只需S2是有和为X-X1的子。假设采用的hash set是 想的,每查和插入都仅 费O(1)的时间。 的时间复 都是O(2(N/2)。 践中,往往可以 将第一得 的 子和 排fl, 再用个针扫描的方 查是有足要求的子和。这 的 ,“可 受的时间 可以解的最大规 约为N=42。搜索还是DP?首 ,可以 据中得 命题图的线索。如果一个背包问题可以用DP解,V一定不能很大,则O(VN)的 无 承受,currency1一般的搜索解 都是仅N有关,V无关的。所以,V很大时( 如上 万),命题的图就 是考察搜索。一方 ,N较大时( 如上 ),命题的图就很有可能是考察动态规。外,想不出合适的动态规 时,就只能用搜索 。 如 一个未过的背包中物品的限制件,无 想出DP的方程,只搜索以谋求一定的 。