小木棍

小木棍

 

原题来自:CERC 1995

乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过  。现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度。给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度。

输入格式

 

第一行为一个单独的整数  表示砍过以后的小木棍的总数。 第二行为  个用空格隔开的正整数,表示  根小木棍的长度。

输出格式

输出仅一行,表示要求的原始木棍的最小可能长度。

样例

样例输入

9
5 2 1 5 2 1 5 2 1

样例输出

6

数据范围与提示

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n,max1,a[100],b[100],sum=0;
int k,last,des,bj,h,m;
int c[100],len;
void dfs(int k,int last,int des)
{
    int i,j;
    if (k==m)
    {
        bj=1;
        return;
    }
    if(des==0)
    {
        for(i=1;i<=n;i++)
        {
            if(c[i]==0)
            {
                c[i]=1;
                break;
            }
        }
        
    
        
        dfs(k+1,i,len-b[i]);
    }
    
        for(i=last+1;i<=n;i++)
        {
            if(c[i]=0&&des>=c[i])
            {
            c[i]=1;
            dfs(k,i,des-b[i]);
            c[i]=0;
            if(i==n)
             break;
            }
        }
        
    
}

main()
{
    int i;
    cin>>n;
    for (i=1;i<=n;i++)
    {
    cin>>a[i];
    sum=sum+a[i];   
    }
    sort(a+1,a+n+1);
    for(i=1;i<=n;i++)
    b[i]=a[n-i+1];  
    for (h=b[1];h<=sum;h++)
    {
        if(sum%h==0)
        {
           memset(c,0,sizeof(c));   
            m=sum/h;
            bj=0;
            len=h;
            dfs(1,1,len-b[1]);
            if(bj==1)
            break;
        }
    }
    cout<<h<<endl;
}

 

 

 

posted @ 2020-08-24 21:14  weidan01  阅读(157)  评论(0)    收藏  举报