这道题以前做过,没做出来。今儿参考别人的做了,感觉这种“动态标记”(自己给这个方法起的名字)的方法挺好的。
#include<iostream>
#include<fstream>
#include<algorithm>
#include<string.h>
using namespace std;
int n;
const int NUM=64;
bool visited[NUM];
int stick[NUM];
int des_len;
int cmp(const void* a,const void *b)
{
return ( *(int *)b-*(int *)a);
}
bool search(int len,int s,int num)
{
if(num==n)
return true;
int last=-1;
for(int i=s;i<n;i++)
{
if(visited[i]||stick[i]==last)
continue;
visited[i]=true;
if(len+stick[i]<des_len)
{
if(search(len+stick[i],i+1,num+1))
return true;
}
else if(len+stick[i]==des_len)
{
if(search(0,0,num+1))
return true;
}
visited[i]=false;
last=stick[i];
if(len==0)
return false;
}
return false;
}
int main()
{
freopen("input.txt","r",stdin);
while(cin>>n&&n!=0)
{
memset(visited,false,sizeof(bool)*NUM);
int sum_len=0;
for(int i=0;i<n;i++)
{
cin>>stick[i];
sum_len+=stick[i];
}
qsort(stick,n,sizeof(int),cmp);
int max_len=stick[0];
for(des_len=max_len;des_len<=sum_len/2;des_len++)
{
if(sum_len%des_len==0&&search(0,0,0))
break;
}
if(des_len<=sum_len/2)
cout<<des_len<<endl;
else
cout<<sum_len<<endl;
}
return 0;
}