蒜头君手上有一些小木棍,它们长短不一,蒜头君想用这些木棍拼出一个等边三角形,并且每根木棍都要用到。 例如,蒜头君手上有长度为 11,22,33,33 的4根木棍,他可以让长度为11,22 的木棍组成一条边,另外 22 跟分别组成 22条边,拼成一个边长为 33 的等边三角形。蒜头君希望你提前告诉他能不能拼出来,免得白费功夫。
输入格式
首先输入一个整数 n(3≤n≤20),表示木棍数量,接下来输入 nn 根木棍的长度 pi (1≤pi≤10000)。
输出格式
如果蒜头君能拼出等边三角形,输出"yes",否则输出"no"。
输入1:
5
1 2 3 4 5
输出1:
yes
输入2:
4
1 1 1 1
输出2:
no
如果木棍总和sum不是3的不是,肯定不是等边三角形。总和是3倍数的话,再深一下看看。
代码如下:
import java.util.Scanner;
import java.util.*;
public class L3 {
static int n, sum;
static int[] a = new int[15];
static boolean[] used = new boolean[15];
static boolean f = false;
// p:当前造出多少根
// s:当前的和是多少
// st:从哪开始考虑木棍
static void dfs(int p, int s, int st) {
if (f)
return;
if (p == 3) {
f = true;
return;
}
if (s == sum / 3) {
dfs(p + 1, 0, 0);
return;
}
for (int i = 0; i < n; i++) {
if (!used[i]) {
used[i] = true;
dfs(p, s + a[i], i + 1);
used[i] = false;
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt();
sum += a[i];
}
if (sum % 3 != 0) {
System.out.println("No");
} else {
dfs(0, 0, 0);
if (f)
System.out.println("yes");
else
System.out.println("no");
}
}
}