资料来源:http://brightstar.cublog.cn/
一、问题描述
Description
Given a set of sticks of various lengths, is it possible to join them end-to-end to form a square?
Input
The first line of input contains N, the number of test cases. Each test case begins with an integer 4 <= M <= 20, the number of sticks. M integers follow; each gives the length of a stick - an integer between 1 and 10,000.
Output
For each case, output a line containing "yes" if is is possible to form a square; otherwise output "no".
Sample Input
3
4 1 1 1 1
5 10 20 30 40 50
8 1 7 2 6 4 4 3 5
Sample Output
yes
no
yes
二、解题思路
解题思路来源于:http://www.cppblog.com/jhpjhyx/archive/2009/05/14/82981.html 在此表示感谢!
三、代码
#include<iostream> #include<algorithm> using namespace std; int N;//木块数量
int L[21];//每块木块的长度
int len;//形成正方形的边长
int s;//所有木块长度
bool used[21]; int cmp(const void * a,const void *b) { return *(int *)b - *(int *)a; } bool find(int setnum,int depth,int sum=0) { if(setnum ==1) return true; for(int i=depth;i<=N;++i) { if(used[i]==true) continue; if (i>1 && !L[i - 1] && L[i] == L[i-1]) continue; int sum_now=L[i]+sum; if(sum_now < len) { used[i]=true; if(find(setnum,i+1,sum_now)) return true; used[i]=false; } else if(sum_now==len) { used[i]=true; if(find(setnum-1,1,0)) return true; used[i]=false; } if(sum_now==len || sum ==0) break; } return false; } int main() { int i,j,t; int MAX; cin>>t; for(i=1;i<=t;++i) { cin>>N; s=0; MAX=0; for(j=1;j<=N;++j) { cin>>L[j]; s+=L[j]; used[j]=false;//设置为未使用
if(L[j]>MAX) MAX=L[j];//考虑单个L[j]>Len
} if(s%4!=0)//总和不能被4整除
{ cout<<"no"<<endl; continue; } else len=s/4; if(MAX>len)//最大的数不有大于边长
{ cout<<"no"<<endl; continue; } qsort(L+1,N,sizeof(int),cmp); if(find(4,1,0)) cout<<"yes"<<endl; else cout<<"no"<<endl; } return 0; }
|
阅读(1407) | 评论(0) | 转发(0) |