代码如下
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int a[70],v[70],val,n,sum,cnt,len;
bool dfs(int stick,int cab,int last){
if(stick > cnt) return true;
if(cab == len){
return dfs(stick+1,0,1);
}
int fail = 0;
for(int i = last;i <= n; i++)
if(!v[i] && cab + a[i] <= len && fail != a[i]){
v[i] = 1;
if(dfs(stick , cab+a[i],i+1)) return true;
fail = a[i];
if(cab == 0 && cab + a[i] == len) return false;
}
return false;
}
int main(){
cin>>n;
for(int i = 1;i <= n; i++){
cin>>a[i];
sum += a[i],val = max(val,a[i]);
}
sort(a + 1,a+n+1);
reverse(a+1,a+n+1);\
for(len = val;len <= sum; len++){
if(sum % len) continue;
memset(v,0,sizeof(v));
cnt = sum / len;
if(dfs(1,0,1)) break;
}
printf("%d",len);
return 0;
}