题目链接:【poj 1011】
<span style="font-size:14px;">#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
int a[100], vis[100], n, sum;
int next[100];
bool cmp(int a, int b)
{
return a>b;
}
bool dfs(int len, int now, int rest, int li)
{
if(now==len) rest--, now=0, li=2;
if(rest==0) return true;
for(int i=li; i<=n;)
{
if(vis[i]==0)
{
if(now+a[i]<=len)
{
vis[i]=1;
if(dfs(len, now+a[i], rest, i+1)) return true;
vis[i]=0;
if(now==0) break;
if(now+a[i]==len) break;
}
i=next[i];
continue;
}
i++;
}
return false;
}
int main()
{
while(~scanf("%d", &n))
{
if(n==0) break;
sum=0;
for(int i=1; i<=n; i++)
{
scanf("%d", &a[i]);
sum+=a[i];
}
sort(a+1, a+n+1, cmp);
for(int i=1; i<=n;)
{
int j;
for(j=i+1; j<=n; j++)
{
if(a[i]!=a[j]) break;
}
while(i<j) next[i]=j,i++;
}
for(int i=a[1]; i<=sum; i++)
{
if(sum%i==0)
{
memset(vis, 0, sizeof(vis));
if(dfs(i,0,sum/i,1))
{
printf("%d\n", i);
break;
}
}
}
}
return 0;
}</span>