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;
}

 

posted @ 2010-08-22 20:07  菜到不得鸟  阅读(135)  评论(0)    收藏  举报