[HDOJ5445]Food Problem(优先队列优化多重背包)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5445

题意:多重背包

分析:f[i][j]=max(f[i-1][j-k*w[i]]+k*v[i])

将j写成w[i]的余数形式 即j=a*w[i]+b

则f[i][j]=max(f[i-1][(a-k)*w[i]+b]-(a-k)*v[i])+a*v[i]

其中0<=k<=min(num[i],j/w[i])

再将a-k换成k

则f[i][j]=max(f[i-1][(k*w[i]+b]-k*v[i])+a*v[i]

其中a-min(num[i],j/w[i])<=k<=a

max()里的是只与k有关的,且不同的j对k的取值有影响,k的取值是一段区间,这就是经典的单调队列优化了

原文地址:https://www.cnblogs.com/wmrv587/p/5869997.html