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