现在的位置: 首页 > 综合 > 正文

2012北大信科夏令营外校上机题目1

2012年05月08日 ⁄ 综合 ⁄ 共 1075字 ⁄ 字号 评论关闭
描述
乔治拿来一组等长的木棒,将它们随机地裁断,使得每一节木棍的长度都不超过50个长度单位。然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度。请你设计一个程序,帮助乔治计算木棒的可能最小长度。每一节木棍的长度都用大于零的整数表示。
输入
输入包含多组数据,每组数据包括两行。第一行是一个不超过64的整数,表示砍断之后共有多少节木棍。第二行是截断以后,所得到的各节木棍的长度。在最后一组数据之后,是一个零。
输出
为每组数据,分别输出原始木棒的可能最小长度,每组数据占一行。
样例输入
9
5 2 1 5 2 1 5 2 1
4
1 2 3 4
0
样例输出
6
5
    #include <iostream>
    #include <cstdlib>
    
    using namespace std;
    
    bool dfs(int l[],bool used[],int n,int minl,int depth,int ans)
    {
    	if(used[depth]==false)
    	{
    		if(ans+l[depth]==minl)
    		{
    			used[depth]=true;
    			return true;
    		}
    		else if(ans+l[depth]>minl)
    			return false;
    		else
    		{
    			if(dfs(l,used,n,minl,depth+1,ans+l[depth])==true)
    			{
    				used[depth]=true;
    				return true;
    			}
    			else if(dfs(l,used,n,minl,depth+1,ans)==true)
    			{
    				used[depth]=false;
    				return true;
    			}
    		}
    	}
    	else
    	{
    		return dfs(l,used,n,minl,depth+1,ans);
    	}
    }
    
    
    int main()
    {
    	int n,i,j,sum,maxl,t,ans;
    	int l[65];
    	bool used[65],flag;
    
    	cin>>n;
    	while(n)
    	{
    		sum=0;maxl=0;flag =false;
    		for(i=1;i<=n;i++)
    		{
    			cin>>l[i];
    			used[i]=false;
    			sum+=l[i];
    			if(maxl<l[i])
    				maxl=l[i];
    		}
    		for(i=maxl;i<=sum;i++)
    		{
    			if(sum%i==0)
    			{
    				t= sum/i;
    				for(j=1;j<=t;j++)
    				{
    					flag=dfs(l,used,n,i,0,0);
    					if(flag==false)
    						break;
    
    				}
    			}
    			if(flag)
    			{	
    				ans = i;
    				break;
    			}
    			else continue;
    		}
    		cout << ans <<endl;
    
    		cin>>n;
    	}
    	//system("pause");
    	return 0;
    }

    抱歉!评论已关闭.