1 //Sticks1011 By XieJiang 20170417
2 /**
3 *0.最小木棍的长度一定小于等于所有木棍长度之和,大于等于输入的最长的木棍
4 *1.当Sticks[i]可用时,而Sticks[i-1]不可用且Sticks[i-1]=Sticks[i],Sticks[i]不可用,在DFS的过程中,
5 如果当前木棒和前一个木棒长度相等,并且前一根木棒没有被使用,这说明此种长度的木棒不在此次遍历的解中,因此直接跳过
6 *2.当组成木棒时,从大到小选取
7 *3.组成木棒时,如果第一个选取的木棒不合适,就直接退出,表示整个木棒集合不合适
8 *4.最终求出的木棒长度一定是总的木棒长的约数
9 */
10 #include <iostream>
11 #include <algorithm>
12 using namespace std;
13 int gSum, gGoal, gN;
14 int gSticks[65], gUsed[65];
15 //归并排序,将输入数据按照从大到小的顺序排序
16 void MegSort(int A[], int T[], int left, int right){
17 int i, j, k, mid = (left + right) / 2;
18 if (left == right)return;
19 MegSort(A, T, left, mid);
20 MegSort(A, T, mid + 1, right);
21 for (i = mid; i >= left; i--)
22 T[i] = A[i];
23 for (j = 1; j <= right - mid; j++)
24 T[right - j + 1] = A[j + mid];
25 for (i = left, j = right, k = left; k <= right; k++){
26 if (T[j] <= T[i])
27 A[k] = T[i++];
28 else
29 A[k] = T[j--];
30 }
31 }
32 //深度搜索,找出将木棒进行配对:当前木棒已经配比的长度,木棒使用到的位置,已经配好的木棒数
33 bool DFS(int tCur, int tIndex, int tNum){
34 if (gGoal * tNum == gSum) return true;
35 int mi;
36 for (mi = tIndex; mi < gN; mi++){
37 if (mi && (gSticks[mi] == gSticks[mi - 1]) && (!gUsed[mi - 1])) continue;//1
38 if (gUsed[mi]) continue;//如果已经被使用,则不再使用
39 if (gSticks[mi] + tCur > gGoal) continue;
40 gUsed[mi] = 1;
41 if (tCur + gSticks[mi] == gGoal){//当前这根木棒配完了
42 if (DFS(0, 0, tNum + 1))//搭配剩下的木棒
43 return true;
44 gUsed[mi] = 0;
45 return false;
46 }
47 if (DFS(tCur + gSticks[mi], mi + 1, tNum))
48 return true;
49 else{
50 gUsed[mi] = 0;
51 if (tCur == 0)
52 return false;//3
53 }
54 }
55 return false;
56 };
57 int main(){
58 int i;
59 cin >> gN;
60 while (gN > 0){
61 gSum = 0; gGoal = 0;
62 for (i = 0; i < gN; i++){
63 cin >> gSticks[i]; gUsed[i] = gSticks[i];
64 gSum += gSticks[i];
65 }
66 MegSort(gSticks, gUsed, 0, gN - 1);
67 memset(gUsed, 0, sizeof(gUsed));
68 for (gGoal = gSticks[0]; gGoal <= gSum; gGoal++){//0 2
69 if (gSum % gGoal != 0)//4
70 continue;
71 memset(gUsed, 0, sizeof(gUsed));
72 if (DFS(0, 0, 0)){
73 cout << gGoal << endl;
74 break;
75 }
76 }
77 cin >> gN;
78 }
79 return 0;
80 }