部分贪心解决大背包问题
先利用数据特殊性将物品压缩成18个,第i个体积是i,重量为w[i],这里w[i]取体积为i的原物品的最大值。
然后找到性价比最大的wi,vi。
考虑任意一个物品p,若取q个该物品且q>=vi,即q=vi+x(x>=0),则总重量为w[p]*(vi+x)
w[p]*(vi+x)=w[p]*vi+w[p]*x<wi*vi+w[p]*x。于是对于任意性价比不为wi,vi的物品,qi<vi。
所以取limit=vi*18,即每个物品都取18个,则容量为k时的最优解可以表示为
令t=(k-limit)/vi(上取整,原论文的下取整不对)
weight(k)=t*wi+f[k-t*vi]。
f可以先DP出来。
然后再做一遍背包,即对合并进行DP,此时令w[i]=weight(i*y)-(i-1)*c,v[i]=i,论文中S为10^9,再次套用刚才的方法求解。
当然题目中S<=1000,可以直接求解。
#include<i


449

被折叠的 条评论
为什么被折叠?



