题意 :觉得这里讲的蛮好的点击打开链接
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 65;
int n,sum,goal;
int stick[MAXN];
bool visit[MAXN];
bool cmp(const int &a,const int &b)
{
return a>b;
}
bool dfs(int now,int index,int cnt)
{
if (goal * cnt == sum)
return true;
for (int i = index ; i < n ; i++)
{
if (visit[i] || (i && !visit[i-1] && stick[i-1] == stick[i]))
continue;
if (now + stick[i] == goal)
{
visit[i] = true;
if (dfs(0,0,cnt+1))
return true;
visit[i] = false ;
return false;
}
else if (now + stick[i] < goal)
{
visit[i] = true ;
if (dfs(now+stick[i],i+1,cnt))
return true;
visit[i] = false;
if (now == 0) //在小于的情况下只要当第一个都没选的情况下才为错,因为在小于的情况下我们并不能保证为错
return false; // notice
}
}
return false;
}
int main()
{
while (scanf("%d",&n) != EOF)
{
if(!n)
break;
sum = 0 ;
for (int i = 0; i < n; i++)
{
scanf("%d",&stick[i]);
sum += stick[i];
}
sort(stick,stick+n,cmp);
for (goal = stick[0]; goal < sum; goal++)
{
if (sum % goal != 0)
continue;
memset(visit,false,sizeof(visit));
if (dfs(0,0,0))
break;
}
printf("%d\n",goal);
}
return 0;
}