Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:是不是深度优先搜索?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: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator