AT2346 [ARC070B] No Need
https://www.luogu.com.cn/problem/AT2346
发现
>
=
K
>=K
>=K的是没用的
就是去掉一个数的背包
按照套路分治做即可,可以用bitset优化成
O
(
n
k
l
o
g
n
w
)
O(\frac{nklogn}{w})
O(wnklogn)
代码实现不难
code:
#include<bits/stdc++.h>
#define N 5050
using namespace std;
int n, m, a[N], ans;
bitset<N> f;
void add(int x) {
if(x >= m) return;
f |= f << x;
}
void solve(int l, int r) {
if(l == r) {
if(a[l] >= m) return ;
for(int i = m - a[l]; i < m; i ++) if(f[i]) {
ans --;
return ;
}
return ;
}
bitset<N> g = f;
int mid = (l + r) >> 1;
for(int i = mid + 1; i <= r; i ++) add(a[i]);
solve(l, mid); f = g;
for(int i = l; i <= mid; i ++) add(a[i]);
solve(mid + 1, r);
}
int main() {
scanf("%d%d", &n, &m); f[0] = 1;
ans = n;
for(int i = 1; i <= n; i ++) scanf("%d", &a[i]), ans -= a[i] >= m;
solve(1, n);
printf("%d", ans);
return 0;
}