https://www.mina.moe/BZPRO/JudgeOnline/2118.html
题目换句话说就是有 n个物品,每个物品有一个重量,每个物品可以选择无限次(完全背包),求最终总重量在 [Bmin,Bmax]中出现了多少次
嗯,首先我们设我们打算让所有取出的物品总重为 w
设第一个取的物品重量为 t,取了 k次
设除了第一个取的物品以外取的物品总重为 v
则有 w=tk+v
也就是说 wmodt=vmodt是 w能被取到的必要条件
因此我们对于所有的 i(i \in [0, t – 1]),计算使得 v \mod t = i的这个 v的最小值
(最小是因为大的能取到的位置小的都能取到)
然后对于每个 i都求出最小的 v后只需要判断 tk + v \in [Bmin, Bmax]这个不等式的 k有多少个解就可以了
复杂度为 O(nt log _ 2 n)(迪杰斯特拉,Spfa 我就不想说了)
由此可见复杂度与 t有关,t取最小的数即可。
代码:
0 条评论