题意
有
n
n
n 种物品,第
i
i
i 种物品有
c
i
c_i
ci 个,体积为
v
i
v_i
vi 。
给定整数集合
S
S
S,从这
n
n
n 种物品中选出
k
(
k
∈
S
)
k(k ∈ S )
k(k∈S) 种物品,每种物品选任意正整数
个,问可以得到哪些小于
L
L
L 的总体积值
对于所有的数据,满足
1
≤
n
,
c
i
,
L
≤
2
×
1
0
3
,
1
≤
v
i
≤
2
×
1
0
3
,
1
≤
m
,
S
1 ≤ n, ci, L ≤ 2 × 10^{3}, 1 ≤ vi ≤ 2 × 10^{3}, 1 ≤ m, S
1≤n,ci,L≤2×103,1≤vi≤2×103,1≤m,S中的元素
≤
n
≤ n
≤n。
题解
记
f
[
i
]
[
j
]
f[i][j]
f[i][j]为
i
i
i中物品能否组成总体积
j
j
j,考虑每一个物品
i
i
i对
f
f
f的贡献。
首先注意到能相互转移的是
j
m
o
d
v
i
jmodv_i
jmodvi下相等的状态,将他们拿出,又有物品个数
c
i
c_i
ci的限制,于是对于每一列,相当对前
c
i
c_i
ci列的或左移
1
1
1位取或,将
f
f
f的两维交换一下,维护每
c
i
c_i
ci个的前后缀和,可在总复杂度
O
(
n
3
/
w
)
O(n^{3}/w)
O(n3/w)的效率内做完。