poj 1011 木棍

简单的深搜啦
#include <stdio.h>
#include <stdlib.h>
int sticks[100],n;
bool used[100];
int cmp(const void *x,const void *y)
{
    return *(int *)y - *(int *)x;
}
bool find(int left,int num,int len)
{
    int i;
    if(left == 0 && num == 0)
    return 1;
    if(left == 0)
    left = len;
    for(i = 0;i < n;i ++)
    {
        if(sticks[i] <= left && !used[i])
        {
            used[i] = 1;
            if(find(left - sticks[i],num-1,len))
            return 1;
            used[i] = 0;
            if(sticks[i] == left || left == len)
            return 0;
        }
    }
    return 0;
}

int main()
{
    int i,sum = 0;
    while(scanf("%d",&n) != EOF && n)
    {
        sum = 0;
        for(i = 0;i < n;i ++)
        {
            scanf("%d",&sticks[i]);
            sum += sticks[i];
            used[i] = 0;
        }
        qsort(sticks,n,sizeof(int),cmp);
        for(i = sticks[0];i <= sum;i ++)
        {
            if((sum % i == 0) && find(i,n,i))
            {
                printf("%d\n",i);
                break;
            }
        }
    }
    return 0;
}
posted @ 2011-07-11 08:49  zhangteng  阅读(182)  评论(0编辑  收藏  举报