Sticks
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 3171 Accepted Submission(s): 780
#include<iostream>
#include<algorithm>
using namespace std;
int len,num,sum,snum;
int stickslenth[100];
int makt[100]; //用于标记木棍是否被使用
int lim;
bool cmp(const int a,const int b)
{
return a > b;
}
bool dfs(int lastlen,int b)
{
int i;
if( -- lim <= 0)
return false;
if(lastlen == 0)//一根木棒已经找出
{
i = 0;
while(i < num && makt[i])
i++;
if(i == num) //当全部的木棍都找出来了的时候则返回真
return true;
makt[i] = true; //将第i个数据标记为已经访问过
if(dfs(len - stickslenth[i],i + 1)) //搜索下一根木棍
return true;
makt[i] = false;
return false;
}
int perlen = -1;
for(i = b; i < num ; ++i)
{
if(makt[i] || lastlen < stickslenth[i] || perlen == stickslenth[i])
continue;
makt[i] = true;
if(dfs(lastlen-stickslenth[i],i+1,t+1))
return true;
makt[i] = false;
perlen = stickslenth[i];
if(lastlen == stickslenth[i])
return false;
}
return false;
}
//-------------------------------------------------------------------------------------------------------------
int main()
{
while( cin >> num , num)
{
sum = 0;
for(int i = 0; i < num; i++)
{
cin >> stickslenth[i];
sum += stickslenth[i];
}
sort(stickslenth,stickslenth+num,cmp);
/*
for(i = 0; i < num ; i++)
cout << stickslenth[i] << " ";
cout << endl;
*/
for(len = stickslenth[0]; len < sum; len++)
{
if(sum % len == 0)//当可以平分为 1156gfddfk;lsdfkl;sdfopksdfsdp[fp[lagsdfksdfdsfsdf
{
snum = sum/len;
memset(makt,false,sizeof(makt));
if(dfs(len,0,0))
break;
}
}
cout << len << endl;
}
return 0;
}