Description
小白手上有一些小木棍,它们长短不一,小白想用这些木棍拼出一个等边三角形,并且每根木棍都要用到。 例如,小白手上有长度为 1,2,3,3 的4根木棍,他可以让长度为1,2 的木棍组成一条边,另外 2 跟分别组成 2 条边,拼成一个边长为 3 的等边三角形。小白希望你提前告诉他能不能拼出来,免得白费功夫。
Input
首先输入一个整数 n(3 ≤ n ≤ 200),表示木棍数量,接下来输入 n 根木棍的长度 p_i(1 ≤ p_i ≤ 10000)。
Output
如果小白能拼出等边三角形,输出"yes",否则输出"no"。
Sample Input 1
5
1 2 3 4 5
Sample Output 1
yes
Sample Input 2
4
1 1 1 1
Sample Output 2
no
直接“神”搜:
#include <bits/stdc++.h>
#define _MAX 100001
using namespace std;
typedef long long ll;
ll n;
ll sum;
ll mid;
ll l[_MAX];
bool flag;
void dfs(int i, int a, int b, int c) {//a,b,c表示三边长度,i表示添加的长度的下标
if(a > mid || b > mid || c > mid) {//任意长度不可能大于边长;
return ;
}
if(a == mid && b == mid && c == mid) {//满足
cout << "yes" << endl;//输出
flag = 1;
return ;
}
if(i > n || flag == 1)
return ;
dfs(i + 1, a + l[i], b, c);
dfs(i + 1, a, b + l[i], c);
dfs(i + 1, a, b, c + l[i]);
//搜索
}
int main() {
cin >> n;//输入
for(int i = 1; i <= n; i++) {
cin >> l[i];//输入
sum += l[i];//计算总和
}
if(sum % 3 != 0) {
cout << "no" << endl;//排除除不尽的情况
return 0;
}
mid = sum / 3;//计算边长
for(int i = 1; i <= n; i++) {
if(l[i] > mid) {
cout << "no" << endl;//任意长度不可能大于边长;
return 0;
}
}
sort(l + 1, l + n + 1);//排序
dfs(1, 0, 0, 0);//搜索
if(!flag)
cout << "no" << endl;//输出
return 0;
}
好了,