传说中的经典深搜,没什么资格发题解了,尊重原创,请参见 http://blog.csdn.net/cfzjxz/article/details/7433138 个人觉得无论是题解还是代码都写得很明白
发上来只是以后别忘了记得再练
唯一的可取之处就是写得比较简洁吧=_=
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <climits>
#include <cctype>
#include <algorithm>
#include <iostream>
#include <queue>
#include <vector>
#include <map>
#include <utility>
#include <stack>
#include <functional>
using namespace std;
typedef long long lovelive;
const int inf = INT_MAX;
const double pai = acos(-1.0);
const double gold = (sqrt(5.0) - 1.0) / 2.0;
int base_arr[117], ans, n, maxc, sum, vis[117];
bool cmp(int a, int b)
{
return a > b;
}
void init()
{
memset(base_arr, 0, sizeof(base_arr));
ans = inf;
maxc = 0;
sum = 0;
return ;
}
void input_data()
{
int i, j, k;
for(i = 0; i < n; ++i)
{
scanf("%d", &base_arr[i]);
maxc = max(maxc, base_arr[i]);
sum += base_arr[i];
}
sort(base_arr, base_arr + n, cmp);
return ;
}
bool solve(int now_len, int left_len, int matches)
{
int i, j, k;
if(matches == n && left_len == 0)
{
ans = now_len;
return true;
}
if(left_len == 0) left_len = now_len;
for(i = 0; i < n; ++i)
{
if(vis[i]) continue;
if(left_len >= base_arr[i])
{
vis[i] = 1;
if(solve(now_len, left_len - base_arr[i], matches + 1))
{
return true;
}
vis[i] = 0;
if(base_arr[i] == left_len || now_len == left_len) break;
while(base_arr[i] == base_arr[i + 1]) i += 1;
}
}
return false;
}
int main()
{
//#ifndef ONLINE_JUDGE
// freopen("in.in", "r", stdin);
// freopen("out.out", "w", stdout);
//#endif // ONLINE_JUDGE
int i, j, k;
while(scanf("%d", &n) != EOF)
{
if(n == 0) break;
init();
input_data();
for(i = maxc; i <= sum; ++i)
{
if(sum % i != 0) continue;
memset(vis, 0, sizeof(vis));
if(solve(i, i, 0))
{
printf("%d\n", ans);
break;
}
}
}
return 0;
}