poj 1011 Sticks

Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 69843 Accepted: 15257

本题对本人来说有点小难啊,交了n次都是tle后来看了别人的代码才知道加了一句剪枝,但这一句话是什么意思,我到现在也没看懂,如果哪位大牛看到此随笔,麻烦给我也解释一下。能举出例子最好!

代码:

 

  
    
1 #include < stdio.h >
2 #include < string .h >
3 #include < stdlib.h >
4   int n,used[ 100 ],sticks[ 100 ];
5   int compare( const void * a, const void * b)
6 {
7 return * ( int * )b -* ( int * )a;
8 };
9 int test( int unused, int left, int len)
10 {
11 int i;
12 if (unused == 0 && left == 0 )
13 return 1 ;
14 if (left == 0 )
15 left = len;
16 for (i = 1 ;i <= n;i ++ )
17 {
18 if (used[i])
19 continue ;
20 if (sticks[i] > left)
21 continue ;
22 used[i] = 1 ;
23 if (test(unused - 1 ,left - sticks[i],len))
24 return 1 ;
25 used[i] = 0 ;
26 if (sticks[i] == left || left == len)
27 break ;
28 }
29 return 0 ;
30 }
31 int main()
32 {
33 int i,max,sum;
34 while (scanf( " %d " , & n) != EOF)
35 {
36 if (n == 0 )
37 break ;
38 max = 0 ;sum = 0 ;
39 for (i = 1 ;i <= n;i ++ )
40 {
41 used[i] = 0 ;
42 scanf( " %d " , & sticks[i]);
43 sum += sticks[i];
44 }
45 qsort(sticks + 1 ,n, sizeof (sticks[ 0 ]),compare);
46 max = sticks[ 1 ];
47 for (i = max;i <= sum;i ++ )
48 {
49 if (sum % i != 0 )
50 continue ;
51 if (test(n,i,i))
52 {
53 printf( " %d\n " ,i);
54 break ;
55 }
56 }
57 }
58 return 0 ;
59 }
60
61

 

你可能感兴趣的:(poj)