1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> using namespace std; const int Mn(70); inline int _max(const int& x,const int& y) { return x>y ? x : y; } inline int _min(const int& x,const int& y) { return x<y ? x : y; } int n; int sum,mx,mn(60); int st[Mn]; void dfs(int rs,int nsm,int ns,int tar) { if(!rs) { cout << tar; exit(0); } if(nsm==tar) { dfs(rs-1,0,mx,tar); return; } for(int i(ns);i>=mn;--i) { if(st[i] && nsm+i<=tar) { --st[i]; dfs(rs,nsm+i,i,tar); ++st[i]; if(nsm==0 || nsm+i==tar) break; } } } int main() { scanf("%d",&n); for(int i(1);i<=n;++i) { int x; scanf("%d",&x); if(x<=50) { ++st[x]; sum += x; mx = _max(mx,x); mn = _min(mn,x); } } for(int i(mx);i<=sum;++i) if(!(sum%i)) dfs(sum/i,0,mx,i); return 0; }
|