#include <cstdio> #include <algorithm> #include <functional> using namespace std; int N, stick[64], tg_length, m, sum; bool used[64]={false}, done; void DFS(int start, int now_length, int cnt) { if(m==cnt) done=true; else if(tg_length==now_length) DFS(0,0,++cnt); else { for(int i=start; i<N; ++i) if(!used[i]&&now_length+stick[i]<=tg_length) { used[i]=true; DFS(i+1, now_length+stick[i], cnt); used[i]=false; } if(0==start||done) return; } } int main() { while(scanf("%d",&N)) { sum=0; for(int i=0; i<N; ++i) { scanf("%d", &stick[i]); sum+=stick[i]; } sort(stick, stick+N, greater<int>()); done=false; for(tg_length=stick[0]; tg_length<=sum; ++tg_length) if(0==sum%tg_length) { m=sum/tg_length; DFS(0, 0, 0); if(true==done) break; } printf("%d/n",tg_length); } return 0; } 搜索,剪枝。