POJ 1011

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, 0, sizeof(used));
106 }
107 }
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, 0, sizeof(used));
106 }
107 }