POJ 1011 Sticks

来源:互联网 发布:数据结构java版 编辑:程序博客网 时间:2024/06/05 06:08

用当前的木棍拼木棒,问能拼成x(x>=1)根等长木棒的最小长度是多少
首先考虑由最大的木棒开始拼,边界条件为所有木棍拼接成一根木棒,因此答案就在max~sum之间枚举。注意一个需要满足的性质是,木棒的总长度sum%当前长度len==0,因为要拼成整数个等长木棒,进行搜索即可

#include<iostream>#include<algorithm>#include<cstring>using namespace std;const int size = 65;int len , stick[size];bool vis [size];int n,sum;bool flag;bool cmp(int a,int b){       return a>b;}void cal(int dep, int now_len, int u){    if(flag )        return ;    if(now_len == len )    {        if(dep ==n)        {            flag = true;        }        else             cal(dep,0,0);        return ;    }    else if(now_len == 0 )    {        int k = 0;        while(vis[k])            k++;        vis[k] = true;        cal(dep+1, stick[k], k+1);        vis[k] = false;    }    else    {        for(int i = u; i < n;i++)        {            if(!vis[i]&&now_len+ stick[i]<=len)                if(!vis[i-1]&&stick [i-1] == stick[i]) continue;                else                {                    vis[i] = true;                    cal(dep+1, now_len+ stick[i],u+1);                    vis[i] = false;                }        }    }}int main(){    while(cin>>n,n)    {        sum = 0;        flag = false;            for(int i =0; i< n ; i++)        {            cin>>stick[i];            sum+= stick[i];         }        sort(stick, stick + n,cmp);        int maxn = stick[0];        for( len = maxn; len< sum; len++)        {            if(sum % len == 0 )            {                   memset(vis, 0, sizeof (vis));                cal(0,0,0);                if(flag)                    break;            }        }        cout<<len<<endl;    }return 0;}