Ray's playground

 

POJ 1011

code
  1 #include <iostream>
  2 #include <algorithm>
  3 using namespace std;
  4 
  5 int sticks[64], n, len, num;
  6 bool used[64];
  7 
  8 bool compare(int a, int b)
  9 {
 10     return a > b;    
 11 }
 12 
 13 bool dfs(int cur, int left, int level) 
 14 {    //cur: index of sticks
 15     //left: left length
 16     //level: succeeded matches
 17     if(left == 0
 18     {
 19         if(level == num-2)
 20         {
 21             return true;
 22         }
 23 
 24         for(cur = 0; used[cur]; cur++)
 25             ;
 26 
 27         used[cur] = true;
 28 
 29         if(dfs(cur+1, len-sticks[cur], level+1))
 30         {
 31             return true;
 32         }
 33 
 34         used[cur] = false;
 35         return false;
 36     } 
 37     else 
 38     {
 39         if(cur >= n-1)
 40         {
 41             return false;
 42         }
 43         for(int i = cur; i < n; i++
 44         {
 45             if(used[i])
 46             {
 47                 continue;
 48             }
 49 
 50             if((sticks[i] == sticks[i-1]) && !used[i-1])
 51             {
 52                 continue;    
 53             }
 54 
 55             if(sticks[i] > left)
 56             {
 57                 continue;
 58             }
 59             used[i] = true;
 60             if(dfs(i, left-sticks[i], level))
 61             {
 62                 return true;
 63             }
 64             used[i] = false;
 65         }    
 66         return false;
 67     }
 68 }
 69 
 70 int main()
 71 {
 72     while(cin>>n) {
 73         if(n == 0)
 74         {
 75             break;
 76         }
 77         int sum = 0;
 78         for(int i = 0; i < n; i++
 79         {
 80              scanf("%d"&sticks[i]);
 81              sum += sticks[i];
 82         }
 83 
 84         sort(sticks, sticks+n, compare); //descending sort
 85         bool end = false;
 86         for(len = sticks[0]; len <= sum/2; len++
 87         {
 88             if(sum%len == 0
 89             {
 90                 used[0= true;
 91                 num = sum/len;
 92                 if(dfs(0, len-sticks[0], 0)) 
 93                 {
 94                     end = true;
 95                     printf("%d\n", len);
 96                     break;    
 97                 }    
 98                 used[0= false;
 99             }    
100         }
101         if(!end)
102         {
103             printf("%d\n", sum);
104         }
105         memset(used, 0sizeof(used));
106     }
107 }

 

posted on 2010-08-14 12:01  Ray Z  阅读(185)  评论(0)    收藏  举报

导航