题目: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的取值是一段区间,这就是经典的单调队列优化了