期末上机之多重背包模板题

题目描述


给出n部番剧,每部番剧的集数和长度都不同,观众看每部番剧所得到的愉悦度也不同,现在观众可以看T分钟番剧,问观众可以获得的最大愉悦度是多少(若所给的集数为2333,则认为集数无限)


解题思路


很明显这是一个裸多重背包问题,和第四次上机SkyLee的补番计划基本一致,但是不同的地方在于,这个题目当集数给2333的时候认为集数是无限的,如果直接套上次的模板很可能就WA了,当集数为2333的时候我们可以稍微处理一下,把这个集数直接设成一个很大的值(我一般喜欢把很大的值设为0x3f3f3f3f),然后套入多重背包求解就可以得出答案。


多重背包的回顾


模型

大概是:有N种物品和一个容量为V的背包。第 i i i件物品最多有M i i i件可用,每件耗费的空间是C i i i,价值是W i i i,求解将哪些物品装入背包可以使这些物品的耗费空间之和不超过背包容量,且价值总和最大。

基本算法

在这里插入图片描述

其中, F [ i , v ] F[i,v] F[i,v]代表前 i i i种物品恰放入一个容量为 v v v的背包的最大价值,显然此算法的复杂度为 O ( V ∑ W i ) O(V \sum W_i) O(VWi)


优化算法

把第 i i i种物品拆成若干件物品,每一件物品有一个系数,这件物品的费用和价值都是原来的费用和价值乘这个系数。令这些系数分别为 1 , 2 , 2 2 . . . 2 k − 1 1,2,2^2...2^{k-1} 1,2,22...2k1,其中 k k k满足 M i − 2 k + 1 > 0 M_i-2^k+1>0 Mi2k+1>0的最大整数。这是二进制的思想,可以将 M i Mi Mi件物品拆成 l o g ( M i ) log(M_i) log(Mi)件物品,比如将 13 13 13件物品拆成 1 , 2 , 4 , 6 1,2,4,6 1,2,4,6的四件物品。这样我们就把原问题转化成了复杂度为 O ( V ∑ l o g W i ) O(V \sum log W_i) O(VlogWi) 01 01 01背包问题,大大降低了复杂度。

伪代码

在这里插入图片描述
这里使用了背包九讲种的伪代码,我们写题目的时候要稍微调整注意一下

  1. M i Mi Mi为2333时将其设为无穷直接套用完全背包模板
  2. 写题的时候注意数据范围,使用 l o n g l o n g longlong longlong类型

总结


简单的模板题了,不过考试的时候越是模板题越要小心注意些细节,不要一上来就套之前做过的板子,不然WA了白白罚时


参考资料



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值