P1120 小木棍
暴搜+剪枝,Σ了
#include<bits/stdc++.h>
using namespace std;
int n,m,a[70],nt[70],cnt,ans,len;
bool used[70],ready;
bool cmp(int a,int b){
return a>b;
}
void dfs(int k,int last,int rest){
int i;
if(!rest){
if(k==m){
ready=1;
return;
}
for(int i=1;i<=cnt;i++)
if(!used[i])break;
used[i]=1;
dfs(k+1,i,len-a[i]);
used[i]=0;
if(ready)return;
}
int l=last+1, r=cnt, mid;
while(l<r){
mid=(l+r)>>1;
if(a[mid]<=rest)r=mid;
else l=mid+1;
}
for(int i=l;i<=cnt;i++){
if(!used[i]){
used[i]=1;
dfs(k,i,rest-a[i]);
used[i]=0;
if(ready)return;
if(rest==a[i]||rest==len)return;
i=nt[i];
if(i==cnt)return;
}
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
int d;
for(int i=1;i<=n;i++){
cin>>d;
if(d>50)continue;
a[++cnt]=d;
ans+=d;
}
sort(a+1,a+cnt+1,cmp);
nt[cnt]=cnt;
for(int i=cnt-1;i>0;i--){
if(a[i]==a[i+1])nt[i]=nt[i+1];
else nt[i]=i;
}
for(len=a[1];len<=ans/2;len++){
if(ans%len!=0)continue;
m=ans/len;
ready=0;
used[1]=1;
dfs(1,1,len-a[1]);
used[1]=0;
if(ready){
cout<<len;
return 0;
}
}
cout<<ans;
return 0;
}

浙公网安备 33010602011771号