ans记录答案,mk用来标记是否用过,cnt表示已经拼成了多少根,res表示目前这一根长度,target枚举最小长度
#include<iostream>
#include<algorithm>
using namespace std;
int n,a[70],ans=0x3f3f3f3f,maxn=0,mk[70],sum,target;
void dfs(int res,int cnt){
if(cnt==sum/target){
ans=min(target,ans);
return;
}
for(int i=1;i<=n;i++){
if(mk[i]==0&&res+a[i]<target){
mk[i]=1;
dfs(res+a[i],cnt);
mk[i]=0;
}
if(mk[i]==0&&res+a[i]==target){
mk[i]=1;
dfs(0,cnt+1);
}
}
return;
}
bool cmp(int x,int y){
return x>y;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
maxn=max(maxn,a[i]);
sum+=a[i];
}
sort(a+1,a+1+n,cmp);
for(int i=maxn;i<=sum;i++){
if(sum%i==0){
target=i;
dfs(0,0);
}
}
cout<<ans;
return 0;
}