等边三角形
蒜头君手上有一些小木棍,它们长短不一,蒜头君想用这些木棍拼出一个等边三角形,并且每根木棍都要用到。 例如,蒜头君手上有长度为 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
每根火柴棒不是加在a边就是b边或者c边:
import java.util.Scanner;
public class Main {
static int n;
static int[] p;
static int x; //每条边应该的长度
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
p = new int[n];
for(int i = 0; i < n; i ++)
p[i] = sc.nextInt();
int sum = 0;
for(int i = 0; i < n; i ++) {
sum += p[i];
}
if(sum % 3 != 0) {
System.out.println("no");
System.exit(0);
}
else {
x = sum / 3;
}
if(dfs(0, 0, 0, 0))
System.out.println("yes");
else
System.out.println("no");
}
private static boolean dfs(int a, int b, int c, int offset) {
if(a == b && b == c && c == x) return true;
if(a > x || b > x || c > x) return false;
if(offset >= n) return false;
if(dfs(a + p[offset], b, c, offset + 1) || dfs(a, b + p[offset], c, offset + 1) || dfs(a, b, c + p[offset], offset + 1))
return true;
return false;
}
}

浙公网安备 33010602011771号