307

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>

#define ll long long

/*
9
5 2 1 5 2 1 5 2 1
4
1 2 3 4
38
2 6 6 8 7 4 1 8 4 1 4 4 3 3 2 3 3 4 6 8 8 7 2 4 1 1 5 8 4 7 6 5 1 3 3 3 1 6
*/

using namespace std;
int sz[101];
ll sum;
bool f;
int total_piece;
int stick_size;
bool visit[101];
int n;

bool cmp(int a,int b)
{
	return a>b;
}

bool backtrack(int present_size,int index,int piece_count)//gainedlength,sticksize,piece count
{
	if(piece_count*stick_size==sum)
		return true;

	for(int i=index;i<n;i++)
	{
		if(visit[i])
			continue;
		if(i>0 && !visit[i-1] && sz[i]==sz[i-1])
			continue;
		if(sz[i]+present_size<stick_size)
		{
			visit[i] = 1;
			f = backtrack(sz[i]+present_size,i+1,piece_count);
			if(f)
			return 1;
			visit[i] = 0;
			if(present_size==0)
			return 0;
		}
		else if(sz[i]+present_size == stick_size)
		{
			visit[i] = 1;
			f = backtrack(0,0,piece_count+1);
			if(f)
			return 1;
			visit[i] = 0;
			return 0;
		}
	}

	return 0;
}

int main()
{
	int max_sz;

	while(cin>>n)
	{
		if(n==0)
		break;
		sum = 0;
		max_sz = 0;
		for(int i=0;i<n;i++)
		{
			cin>>sz[i];
			sum+=sz[i];
			if(sz[i]>max_sz)
			max_sz = sz[i];
		}

		sort(sz,sz+n,cmp);
		bool found = false;
		for(int stk= max_sz;stk<=sum;stk++)
		{
			if(sum%stk)
			continue;
			memset(visit,0,sizeof(visit));
			total_piece = sum/stk;
			stick_size = stk;

			if(backtrack(0,0,0))
			{
				cout<<stk<<"\n";
				found = 1;
				break;
			}
		}
	}

	return 0;
}

 

Leave a Reply

Your email address will not be published. Required fields are marked *