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
题目大意:深搜题 输入木棍数吧 然后让你拿这些木棍组成正方行 能了就yes else就no 代码会给出详解
#include
<iostream>
#include <cstring>
#include <algorithm>
using namespace std ;
const int maxn = 25 ;
bool flag ;
bool vis [maxn ]; //表示木条用过没
int a [maxn ];
int length ;
int n ;
bool cmp ( int a , int b ) //sort函数 让输入的木条数从大到小排序
{
return a >b ;
}
void dfs ( int sum , int index , int cnt ) //深搜
{
if (sum ==length ) //sum 是当前木棍组成长度 length边长
{
#include <cstring>
#include <algorithm>
using namespace std ;
const int maxn = 25 ;
bool flag ;
bool vis [maxn ]; //表示木条用过没
int a [maxn ];
int length ;
int n ;
bool cmp ( int a , int b ) //sort函数 让输入的木条数从大到小排序
{
return a >b ;
}
void dfs ( int sum , int index , int cnt ) //深搜
{
if (sum ==length ) //sum 是当前木棍组成长度 length边长
{
cnt
++; //边数
sum = 0 ;
index = 0 ; //第几跟木条
}
if (cnt == 3 ) //已完成三条边判断后 就可已判断ok了
{
flag = 1 ;
}
if (flag )
{
return ;
}
for ( int i =index ; i <n ; i ++)
{
if (!vis [i ]&&sum +a [i ]<=length ) //判断条件
{
vis [i ]= 1 ; //用过就变成1
dfs (sum +a [i ],i +1 ,cnt ); // 深搜重点
vis [i ]= 0 ; //搜索不成公后就要给它变为0 找下一种符情况
}
}
}
int main ()
{
int t ;
cin >>t ;
while (t --)
{
int sum = 0 ;
cin >>n ;
for ( int i = 0 ; i <n ; i ++)
{
cin >>a [i ]; //输入木棍长度
sum +=a [i ];
}
length =sum / 4 ; //边长
sort (a ,a +n ,cmp ); //从大到小排序
if (a [ 0 ]>length ||sum % 4 != 0 ) //先判断符合不符合
{
sum = 0 ;
index = 0 ; //第几跟木条
}
if (cnt == 3 ) //已完成三条边判断后 就可已判断ok了
{
flag = 1 ;
}
if (flag )
{
return ;
}
for ( int i =index ; i <n ; i ++)
{
if (!vis [i ]&&sum +a [i ]<=length ) //判断条件
{
vis [i ]= 1 ; //用过就变成1
dfs (sum +a [i ],i +1 ,cnt ); // 深搜重点
vis [i ]= 0 ; //搜索不成公后就要给它变为0 找下一种符情况
}
}
}
int main ()
{
int t ;
cin >>t ;
while (t --)
{
int sum = 0 ;
cin >>n ;
for ( int i = 0 ; i <n ; i ++)
{
cin >>a [i ]; //输入木棍长度
sum +=a [i ];
}
length =sum / 4 ; //边长
sort (a ,a +n ,cmp ); //从大到小排序
if (a [ 0 ]>length ||sum % 4 != 0 ) //先判断符合不符合
{
cout
<<
"no"
<<endl
;
}
else
{
memset (vis , 0 , sizeof (vis )); //都没用过先表上0
flag = 0 ;
dfs ( 0 , 0 , 0 );
if (flag )
{
cout << "yes" <<endl ;
}
else
{
cout << "no" <<endl ;
}
}
}
return 0 ;
}
}
else
{
memset (vis , 0 , sizeof (vis )); //都没用过先表上0
flag = 0 ;
dfs ( 0 , 0 , 0 );
if (flag )
{
cout << "yes" <<endl ;
}
else
{
cout << "no" <<endl ;
}
}
}
return 0 ;
}