POJ Sticks1011解题报告
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 }