等边三角形
蒜头君手上有一些小木棍,它们长短不一,蒜头君想用这些木棍拼出一个等边三角形,并且每根木棍都要用到。 例如,蒜头君手上有长度为 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; } }