fzu-1099

来源:互联网 发布:网络创业论文参考文献 编辑:程序博客网 时间:2024/05/09 22:36

贴个别人的代码:

问题是给定几根固定长度的木棍,问是否能组合成正方形,正方形的长度即是总长度。先将木棍从大到小排序,最大的木棍不能大于总长度的1/4,即是正方形的边长。扫描木棍,查找能组合成正方形的木棍。

#include <iostream>#include <algorithm>using namespace std;int n;              //小棒总数int len;            //当前枚举的原棒长度int parts;          //当前组合的原棒数int sum;            //所有小棒的总长int a[100];       //存储小棒相关信息bool used[100];      //标记小棒是否使用bool pt(int a,int b){return a>b;}/***深度优先搜索**  res:当前已组合进去的木棒的长度**  cpl:组合进去的小木棒的条数**level:搜索的起始深度*/bool dfs(int res,int cpl,int level)    {int i;if (res==len)//此时组合已经达到每边的长度了{res=0;cpl++;}if (cpl==parts)  //刚好组合等于四边四组组合一起的木棒{return true;}    for(i=level;i<n;i++){if(i && !used[i-1] && a[i]==a[i-1])//剪枝,相同元素当前一个元素亦是没组合的,当前元素不再处理continue;if(used[i]==0){if(res + a[i] <len)//继续查找下x个元素能和当前元素组合成等于边长{used[i] = true;if(dfs(res+a[i],cpl,i+1))return true;used[i] = false;}else if(res+a[i]==len)//找到1组了,继续查找后续分组,都成功才可以。{used[i] = true;if(dfs(0,cpl+1,0))return true;used[i] = false;}if(res==0)//在当前元素下,此组可以成功但查找下组失败,或是此组不可以成功组合,推出循环,返回失败break;}                    }    return false;  }int main(){int N;while (cin>>N){while(N--){sum=0;cin>>n;for (int i=0;i<n;i++){cin>>a[i];sum+=a[i];used[i]=false;}sort(a,a+n,pt);len=sum/4;parts=4;if (sum%4==0 && dfs(0,1,0)){cout<<"yes"<<endl;} else{cout<<"no"<<endl;}}}return 0;}