Problem
$n$种物品,每种物品有三个参数$t,u,v$分别代表:贡献,大小,数量。
$m$种背包,每种背包有三个参数$x,y,z$分别代表:容量,花费,数量。
要求贡献和大于等于p时的最小花费。
若花费超过50000或贡献无法不小于p则输出TAT。
PS:对于一份物品来说,它可以被拆开,分成几份运输,但是只有该份物品被运输完全才可以获得贡献。
$n,m<200;p<50000;t,u,v,x,y,z<100$
Solution
多重背包。
将背包的数量拆分成$\sum\limits_{2^i\leq num} 2^i$和剩余部分。
然后跑01背包就可以了。
好了,现在考虑这道题。
看起来我们只要做两次背包即可。
一次对物品,求出贡献大于等于p时所需的最小空间siz。
一次对车,求出空间大于等于siz时所需的最小花费。
但是,这两种背包的处理方式却不同。
对物品,我们设f[i]表示贡献为i时的最小空间。
对车,我们设f[i]表示花费为i时的最大空间。
为什么呢?
因为物品的空间和与车的空间和可能有$2*10^6$,转移直接时间爆炸。
所以,我们将物品空间与车的空间和放在转移的权值内,下标为较小的物品贡献与车的花费。
这样就可以巧妙解决啦~(≧▽≦)/~
Code
1 |
|