《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[k,v]=max\{F[k-1,v-Ci]+Wi,F[k,v]\}  Ci \in K group F[k,v]=max{F[k1,vCi]+Wi,F[k,v]} CiKgroup

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背包概念拓展了,将众多物品看成一个组,对于该组有取一个或者不取两种可能。这种问题转化的能力,需要多思考,多总结。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值