【JZOJ4916】完全背包问题 题解

来源:互联网 发布:js 清除cookie 编辑:程序博客网 时间:2024/05/18 10:43

题目大意

      有 n 种物品,体积分别为 v[1]…v[n],每种物品无限个。
      现在有 m 次询问,每次询问给定一个容量为 w 的背包,问是否存在一种物品选择方案,使背包恰好装满。同时,要求所选物品中,体积不小于 L 的物品总数量不超过 C 件。
      n<=50, m<=10^5, w<=10^18
      v[i]<=10000, L<=20000, C<=30

【30%】w<=10000, n<=30, m<=200

      设 f[i, j] 表示:做到第 i 件物品,其中大件物品有 j 件,的方案是否存在。
      随便转移。

【100%】

      设 n 种物品中最小的是 v[1]。
      若 v[1]>=L,即全是大件物品,那么用暴力一点的方法搞掉。以下讨论 v[1] < L 的情况。

      经典套路:设 f[i, j] 表示:用了 j 件大件物品和若干小件物品,使得体积 mod v[1] 等于 i ,的最小体积。询问答案的时候直接看 f[w mod v[1], C] 是否小于等于 w 即可。
      然后观察这个转移,我们选大件物品的话,转移到 j+1 没什么问题,但是如果选小件物品,就会出现后效性,即这个转移路径是个环。我们要用最短路模型来实现选小件物品的转移。

代码

//略
0 0
原创粉丝点击