pku1011 Sticks(降序排列才能AC啊)
//16MS
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define MAXN 65
bool mycmp(int a,int b)
{//降序,否则超时
return a>b;
}
int n,unit,num,sticks[MAXN];
bool ok,used[MAXN]={0};
void dfs(int idx,int len,int cnt)
{
if(cnt==num) ok=true;
else if(len==unit) dfs(0,0,cnt+1);
else
for(int i=idx; i<n; i++)
{
if(!used[i] && len+sticks[i]<=unit )
{
used[i]=true;
dfs(idx+1,len+sticks[i],cnt);
used[i]=false;
if(idx==0 || ok) return;
if(sticks[i]==unit-len) return;
int k=i+1;
while(k<n && sticks[k]==sticks[i]) k++;
i=k-1;
}
}
}
int main()
{
int i,total;
while(scanf("%d",&n),n)
{
total=0;
for(i=0; i<n; i++)
{
scanf("%d",&sticks[i]);
total+=sticks[i];
}
sort(sticks,sticks+n,mycmp);
ok=false;
for(unit=sticks[0]; unit<=total/2; unit++)
{
if(total%unit==0)
{
num=total/unit;
// memset(used,false,sizeof(used));
dfs(0,0,0);
}
if(ok)
{
printf("%d\n",unit);
break;
}
}
if(!ok) printf("%d\n",total);
}
return 0;
}
浙公网安备 33010602011771号