终于,破解了千年的难题。小 FF 找到了王室的宝物室,里面堆满了无数价值连城的宝物。
这下小 FF 可发财了,嘎嘎。但是这里的宝物实在是太多了,小 FF 的采集车似乎装不下那么多宝物。看来小 FF 只能含泪舍弃其中的一部分宝物了。
小 FF 对洞穴里的宝物进行了整理,他发现每样宝物都有一件或者多件。他粗略估算了下每样宝物的价值,之后开始了宝物筛选工作:小 FF 有一个最大载重为 $W$ 的采集车,洞穴里总共有 $n$ 种宝物,每种宝物的价值为 $v_i$,重量为 $w_i$,每种宝物有 $m_i$ 件。小 FF 希望在采集车不超载的前提下,选择一些宝物装进采集车,使得它们的价值和最大。
对于 $100%$ 的数据,$n\leq \sum m_i \leq 10^5$,$0\le W\leq 4\times 10^4$,$1\leq n\le 100$。
每一个数都可以表示成 $2$ 的幂的和(因为每一个数都可以用二进制表示)。
时间复杂度:$O(nW\sum \log m_i)$
| |
设 $f[i][j]$ 表示前 $i$ 种物品重量不超过 $j$ 的最大价值。显然有一个状态转移方程:
$$ f[i][j] = max_{0<=k<=m[i]}{f[i-1][j-k\times w[i]]+k\times v[i]} $$
我们设 $j=k_1*w[i]+d$:
$$ f[i][j]=max{f[i-1][(k_1-k)\times w[i]+d]-(k_1-k)\times v[i] }+ k_1\times v[i] $$
我们枚举余数 $d$ 和 $k_1$,就可以表示出每一个数,然后维护一个单调队列,这个队列里面的决策通过加上第 $i$ 种物品都可以凑成 $j$,因此增加的数量不能超过 $m[i]$,也就是 $k_1-k <= m[i]$。
时间复杂度:$O(nW)$
| |
终于,破解了千年的难题。小 FF 找到了王室的宝物室,里面堆满了无数价值连城的宝物。
这下小 FF 可发财了,嘎嘎。但是这里的宝物实在是太多了,小 FF 的采集车似乎装不下那么多宝物。看来小 FF 只能含泪舍弃其中的一部分宝物了。
小 FF 对洞穴里的宝物进行了整理,他发现每样宝物都有一件或者多件。他粗略估算了下每样宝物的价值,之后开始了宝物筛选工作:小 FF 有一个最大载重为 $W$ 的采集车,洞穴里总共有 $n$ 种宝物,每种宝物的价值为 $v_i$,重量为 $w_i$,每种宝物有 $m_i$ 件。小 FF 希望在采集车不超载的前提下,选择一些宝物装进采集车,使得它们的价值和最大。
对于 $100%$ 的数据,$n\leq \sum m_i \leq 10^5$,$0\le W\leq 4\times 10^4$,$1\leq n\le 100$。
每一个数都可以表示成 $2$ 的幂的和(因为每一个数都可以用二进制表示)。
时间复杂度:$O(nW\sum \log m_i)$
| |
设 $f[i][j]$ 表示前 $i$ 种物品重量不超过 $j$ 的最大价值。显然有一个状态转移方程:
$$ f[i][j] = max_{0<=k<=m[i]}{f[i-1][j-k\times w[i]]+k\times v[i]} $$
我们设 $j=k_1*w[i]+d$:
$$ f[i][j]=max{f[i-1][(k_1-k)\times w[i]+d]-(k_1-k)\times v[i] }+ k_1\times v[i] $$
我们枚举余数 $d$ 和 $k_1$,就可以表示出每一个数,然后维护一个单调队列,这个队列里面的决策通过加上第 $i$ 种物品都可以凑成 $j$,因此增加的数量不能超过 $m[i]$,也就是 $k_1-k <= m[i]$。
时间复杂度:$O(nW)$
| |