《DP学习系列》从零开始学习动态规划,分组背包(六)

前言

  引文来自崔添翼背包九讲

1. 题目

背包有N件物品和一个容量为V的背包。第i件物品的费用是Ci,价值是Wi。这些物品被划分为K组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

2. 分析

这个问题变成了每组物品有若干种策略:是选择本组的某一件,还是一件都不选。也就是说设F [k,v]表示前k组物品花费费用v能取得的最大权值,则有:

  将组看成之前的一种物品,实际上将新问题转化成01背包问题。可以快速写出状态转移矩阵和伪代码(最好不参照背包九讲,自己想出来怎么写):

F [ k , v ] = m a x { F [ k 1 , v C i ] + W i , F [ k , v ] }   C i K g r o u p

F[v]
F[0]=0
//假设第k组的物品为L1,L2...Ln
for k=1 to K
    for  v=V to 0
        for j=1 to n
            F[v]=max{F[v],F[v-Cj]+Wj}

3. 总结

分组的背包问题将彼此互斥的若干物品称为一个组,这建立了一个很好的模型。不少背包问题的变形都可以转化为分组的背包问题(例如7),由分组的背包问题进一步可定义“泛化物品”的概念,十分有利于解题。

  实际上分组是将前面的01背包概念拓展了,将众多物品看成一个组,对于该组有取一个或者不取两种可能。这种问题转化的能力,需要多思考,多总结。

猜你喜欢

转载自blog.csdn.net/lovestackover/article/details/80644478