事实证明数组比set快多了,我set调了很多,最多也就过了9个数据,改成数组直接ac了QAQ
#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
typedef long long ll;
const int N=50;
ll ans=-1,w,n,g=0,t=0;
int a[N],vis[N];
int cnt[1<<24];
int bcnt[1<<24];
set<ll>s;
void dfs1(ll e,int start)
{
cnt[g++]=e;
for(int i=start;i<n/2;i++)
{
if(e+a[i]>w) continue;
else dfs1(e+a[i],i+1);
}
}
void dfs2(ll e,int start)
{
// auto x=s.upper_bound(w-e);x--;
int pos=upper_bound(bcnt,bcnt+t,w-e)-bcnt-1;
ans=max(ans,e+bcnt[pos]);
for(int i=start;i<n;i++)
{
if(e+a[i]>w) continue;
else dfs2(e+a[i],i+1);
}
}
int main()
{
cin>>w>>n;
for(int i=0;i<n;i++) scanf("%d",&a[i]);
sort(a,a+n);
reverse(a,a+n);
dfs1(0,0);
sort(cnt,cnt+g);
bcnt[0]=cnt[0];
for(int i=1;i<g;i++)
{
while(cnt[i]==bcnt[t]) i++;
bcnt[t++]=cnt[i];
}
// for(int i=0;i<t;i++) cout<<bcnt[i]<<' ';cout<<endl;
sort(a+n/2,a+n);
reverse(a+n/2,a+n);
dfs2(0,n/2);
cout<<ans<<endl;
return 0;
}
就是二分预处理一下,时间复杂度刚好卡过去QAQ