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

描述
乔治拿来一组等长的木棒,将它们随机地裁断,使得每一节木棍的长度都不超过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;
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值