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 }

 

posted @ 2017-04-18 00:08  天下岂有长生不灭者  阅读(301)  评论(0编辑  收藏  举报