题目背景:某君手上有一些小木棍,它们长短不一,蒜头君想用这些木棍拼出一个等边三角形,并且每根木棍都要用到。例如,蒜头君手上有长度为1,2,3,3的4根木棍,他可以让长度为1,2的木棍组成一条边,另外2跟分别组成2条边,拼成一个边长为3的等边三角形。蒜头君希望你提前告诉他能不能拼出来,免得白费功夫。
输入格式:
首先输入一个整数n(3≤n≤10),表示木棍数量,接下来输入n根木棍的长度
pi(1≤pi ≤10000)。
输出格式:
如果能拼出等边三角形,输出“yes",否则输出“no"。
样例输入:
5
1 2 3 4 5
样例输出:
yes
样例输入:
4
1 1 1 1
样例输出:
no
示例代码:
#include<iostream>
using namespace std;
int n, p[15], sum;
bool f = false;
bool vis[15];
void dfs(int b, int s, int st) //从下往上思考
{
if(f) //最大的边界条件
{
return ;
}
if(b == 3) //如果能够dfs到所谓第四边,则前面一定都是合法的,结束
{
f = true;
return ;
}
if(s == sum / 3) //深入至该边达到边界时,进入下一边
{
dfs(b + 1, 0, 0);
return ;
}
for (int i = 0; i < n; i++) //最基层的深入与回溯
{
if(!vis[i])
{
vis[i] = 1;
dfs(b, s + p[i], i + 1);
vis[i] = 0;
}
}
}
int main()
{
cin >> n;
sum = 0;
for (int i = 0; i < n; i++)
{
cin >> p[i];
sum += p[i];
}
if(sum % 3 != 0)
{
cout << "no" << endl;
}
else
{
dfs(0, 0, 0);
if(f)
{
cout << "yes" << endl;
}
else
{
cout << "no" << endl;
}
}
return 0;
}