怎么改都是460ms,整迷糊了
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
using namespace std;
typedef pair<int,int> PII;
typedef long long ll;
const int N=70;
int n,m;
int a[N];
int sum=0;
int cnt=0,ans;
bool use[N];
int nxt[N];
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9')
x=x*10+ch-'0',ch=getchar();
return x*f;
}
bool cmp(int a,int b){
return a>b;
}
void dfs(int now,int last,int len){
int pos;
if(!len){
if(now==m){
cout<<ans;
exit(0);
}
for(pos=1;pos<=cnt;pos++){
if(!use[pos]) break;
}
use[pos]=1;
dfs(now+1,pos,ans-a[pos]);
use[pos]=0;
}
int l=last,r=cnt;
while(l+1<r){
int mid=(l+r)>>1;
if(a[mid]<=len) r=mid;
else l=mid;
}
for(int i=l;i<=cnt;i++){
if(use[i]) continue;
use[i]=1;
dfs(now,i,len-a[i]);
use[i]=0;
if(ans==a[i]||ans==len) return;
i=nxt[i];
if(i==cnt) return;
}
}
int main(){
n=read();
for(int i=1;i<=n;i++){
int t;
t=read();
if(t>50) continue;
a[++cnt]=t;
sum+=t;
}
sort(a+1,a+1+n,cmp);
nxt[cnt]=cnt;
for(int i=n-1;i>0;i--){
if(a[i]==a[i+1]) nxt[i]=nxt[i+1];
else nxt[i]=i;
}
for(ans=a[1];ans<=sum/2;ans++){
if(sum%ans) continue;
m=sum/ans;
use[1]=1;
dfs(1,1,ans-a[1]);
use[1]=0;
}
cout<<sum;
return 0;
}