题目大意
给出一堆长度各异的木棍,这些木棍能否头尾相连成一个正方形?
样例输入
3
4 1 1 1 1
5 10 20 30 40 50
8 1 7 2 6 4 4 3 5
样例输出
yes
no
yes
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const Int MAXN 25,
int side;//边长
int m; //树枝数目
int sticks[MAXN];
bool visit[MAXN];
bool DFS(int sum, int number, int position)
{ if(number== 3) return true;
int sample = 0; //剪枝
for (int i= position; i< m; ++i)
{
if(visit[i]|| sum+sticks[i]>side||sticks[i]==sample)
continue;
visit[i] = true;
if(sum + sticks[i] == side)//若形成一条边
{
if(DFS(0,number+1,0))
return true;
else sample = sticks[i];
}
else{
if(DFS(sum+sticks[i],number,i+1))
return true;
else
sample = sticks[i];
}
visit[i] = false;
}
return false;
}