题解 AT2346【[ARC070B] No Need】
Description
给定一个大小为
n 的正整数集合,一个元素和不小于k 的非空子集被称为优秀的,问有多少个元素满足把它改成0 而不会影响优秀子集的个数。
Solution
有一个重要的性质:若
设最小的一个必须的数为
考虑一个含有
把
于是我们只要将
考虑它的一个必要条件:
比
然后一边扫一边做背包就行了,时间复杂度
可以用bitset
优化到
code
#include<bits/stdc++.h>
using namespace std;
const int maxn = 5e3 + 5;
int f[maxn],n,k,a[maxn],cnt;
bool cmp(int a,int b){return a > b;}
int main()
{
scanf("%d%d",&n,&k);
for(int i = 1;i <= n;i++)
scanf("%d",&a[i]);
sort(a + 1,a + 1 + n,cmp);
f[0] = 1;
for(int i = 1;i <= n;i++)
{
if(a[i] >= k)
cnt = i;
else
for(int j = k - 1;j >= k - a[i];j--)
if(f[j])
{cnt = i;break;}
for(int j = k;j >= a[i];j--)
f[j] |= f[j - a[i]];
}
cout << n - cnt;
return 0 ;
}