多重背包单调队列优化核心的地方不懂,文章里面具体说明
我从网上查找资料学习这个知识的,不懂的地方是当判断物品既不是01背包,也不是完全背包时,之后的语句意思就分析不清楚了。我把别人的代码写下来:题目大意:给你N(1 ≤ N ≤ 100)种钞票以及拥有的张数,以及一个给定的值M(1 ≤ M ≤ 100,000 )。你需要统计出用这些钞票能够凑出来的钱数,在1 - M的范围中有多少个。
for (i = 1; i <= n; i++)
{
maxi = w[i] * s[i];
if (s[i] == 1)
{
for (j = m; j >= w[i]; j--)
dyna[j] = max(dyna[j], dyna[j - w[i]]);
}
else if (maxi < m)
{
for (j = 0; j < w[i]; j++)
{
head = tail = 0;
for (k = j; k <= m; k += w[i])
{
if (tail != head) { if (k - pl[head] > maxi) head++; }
if (dyna[k])
{
dqueue[tail] = dyna[k];
pl[tail] = k; tail++;
}
else if (tail != head) dyna[k] = 1;
}
}
}
else
{
for (j = w[i]; j <= m; j++)
dyna[j] = max(dyna[j], dyna[j - w[i]]);
}
}
每个变量的意思:数组dyna就是DP的那个数组了,maxi变量用于判断物品属于完全背包,还是多重背包。head跟tail用来指示队列的头和尾。