Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:是不是深度优先搜索?

Posted by SCUQIFUGUANG at 2015-04-30 16:08:51 on Problem 1011
In Reply To:是不是深度优先搜索? Posted by:139074241 at 2015-02-04 14:02:38
> #include<iostream>
> #include<algorithm>
> #include<cstring>
> #include<functional>                           //greater<int> 所用。 
> using namespace std;
> int l[68],n,num,aim;
> bool t[68];                                    //标记对应木棍是否已经使用。 
> bool dfs(int stick,int len,int pos)
> {
> 	/*stick表示当前已组合好的棍子数,len表示已有的长度,pos表示搜索到第几根。*/ 
> 	bool sign=(len==0?true:false);
> 	if(stick==num)                             //stick==num表示搜索成功。 
> 		return true;
> 	for(int i=pos+1;i<n;++i)
> 	{
> 		if(t[i])                               //该木棍已被用过,跳过。 
> 			continue;
> 		if(len+l[i]==aim)                      //len加上这个木棍刚好组成目标长度. 
> 		{
> 			t[i]=true;                         //先标记使用,再向下一层搜索。 
> 			if((dfs(stick+1,0,-1)))            //下一层搜索成功,返回成功。 
> 				return true;
> 			t[i]=false;                        //下一层搜索未成功,该木棒重新标记为未使用。 
> 			return false;                      //返回此层搜索失败。 
> 		}
> 		else if(len+l[i]<aim)                  //len加上此木棍组成小于目标长度的木棍。 
> 		{
> 			t[i]=true;                         //先标记使用。 
> 			if(dfs(stick,len+l[i],i))          //向下一层搜索,注意参数变化。 
> 				return true;
> 			t[i]=false;                        //下一层搜索失败,该木棍重现标记为未使用。 
> 			if(sign)
> 				return false;
> 			while(l[i]==l[i+1])                //下一根木棍和当前木棍长度相同,则不必重复检验,剪枝。 
> 				++i;
> 		}
> 	}
> 	return false;
> }
> int main()
> {
> 	int i,sum;
> 	while(cin>>n&&n)
> 	{
> 		sum=0;
> 		for(i=0;i<n;++i)
> 		{
> 			cin>>l[i];
> 			sum+=l[i];
> 		}
> 		sort(l,l+n,greater<int>());                //将所有木棍降序排列。 
> 		for(aim=l[0];aim<=sum;++aim)
> 			if(sum%aim==0)
> 			{
> 				num=sum/aim;                     //num指拼成的木棍的个数。 
> 				memset(t,0,sizeof(t));
> 				if(dfs(1,0,-1))
> 				{
> 					cout<<aim<<endl;
> 					break;
> 				}
> 			}
> 	}
> 	return 0;
> }
http://hot.weidian.com/shop?appName=32892170624000001

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator