RT,代码如下
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast","-funroll-loops","-fdelete-null-pointer-checks")
#pragma GCC target("ssse3","sse3","sse2","sse","avx2","avx")
#include<bits/stdc++.h>
using namespace std;
const int maxn=25;
const int maxm=(1<<20)+5;
int a[maxn];
int n,m;
int ans2=-0x3f3f3f3f;
bool isok[maxm];
int main()
{
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++)scanf("%d",&a[i]);
for(int s=1;s<(1<<n);s++)
{
int cnt=0;
for(int i=0;i<n;i++)
{
if(s&(1<<i))cnt++;
}
if(cnt==n-m)isok[s]=1;
}
for(int s=1;s<(1<<n);s++)
{
if(!isok[s])continue;
bitset<maxm>ans;ans[0]=1;
for(int j=0;j<n;j++)
{
if(!(s&(1<<j)))continue;
ans=ans|ans<<a[j];
}
ans2=max(ans2,(int)ans.count());
}
printf("%d\n",ans2-1);
}
感觉复杂度没有很炸裂啊,O(2n×n) 差不多在 n=20 的时候也才 2e7,不知道为什么常数那么大。