T了。
有没有少的/多余的剪枝?
#include<bits/stdc++.h>
using namespace std;
int n,sum,ret,vis[110],a[110];
int cmp(int a,int b){
return a>b;
}void dfs(int st,int now,int k){
if(now==0){
if(sum/ret==st){
printf("%d",ret);
exit(0);
}for(int i=1;i<=n;i++){
if(vis[i]==1){
dfs(st+1,ret,i);
return;
}
}
}if(k>n){
return;
}for(int i=k;i<=n;i++){
if(vis[i]==0&&a[i]<=now){
vis[i]=1;
dfs(st,now-a[i],i+1);
vis[i]=0;
if(ret==now){
break;
}while(i<=n-1&&a[i]==a[i+1]){
i++;
}
}
}
}int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
sum+=a[i];
}sort(a+1,a+n+1,cmp);
for(int i=a[1];i<=sum;i++){
if(sum%i==0){
ret=i;
dfs(1,i,1);
}
}return 0;
}