Sticks

来源:互联网 发布:网吧吃鸡优化 编辑:程序博客网 时间:2024/06/05 18:55


http://acm.hdu.edu.cn/showproblem.php?pid=1455

#include<iostream>
#include<algorithm>
using namespace std;
int a[100],vis[100],n,sum,k,res;
bool cmp(int x,int y)
{
 return x>y;
}
bool dfs(int num,int cur,int sum1)
{
 if(sum1==k)
 {
  num++;
  cur=1;
  sum1=0;
  if(num==sum/k-1)
  return 1;
 }
 for(int i=cur;i<n;i++)
 {
  if(!vis[i])  
  {
   vis[i]=1;
   if(i>=1 && a[i]==a[i-1] && !vis[i-1])
   {
    vis[i]=0;
    continue;
   }
   if(sum1+a[i]<=k && dfs(num,i+1,sum1+a[i]))
   return 1;
   vis[i]=0;
   if(sum1==0)
   return 0;
  }
 }
 return 0;
}
int main()
{
 while(cin>>n,n)
 {
  sum=0;
  int max=0;
  for(int i=0;i<n;i++)
  {
   cin>>a[i];
   sum+=a[i];
  }
  sort(a,a+n,cmp);
  for(k=a[0];k<=sum;++k)
  {
   memset(vis,0,sizeof(vis));
   if(sum%k==0 && dfs(0,0,0))
   {
    cout<<k<<endl;
    break;
   }
   if(k==sum)
   cout<<k<<endl;
  }
 // cout<<k<<endl;
 }
 return 0;
}

0 0