Loading

等边三角形

蒜头君手上有一些小木棍,它们长短不一,蒜头君想用这些木棍拼出一个等边三角形,并且每根木棍都要用到。 例如,蒜头君手上有长度为 11,22,33,33 的4根木棍,他可以让长度为11,22 的木棍组成一条边,另外 22 跟分别组成 22条边,拼成一个边长为 33 的等边三角形。蒜头君希望你提前告诉他能不能拼出来,免得白费功夫。

输入格式

首先输入一个整数 n(3n20),表示木棍数量,接下来输入 nn 根木棍的长度 pi(1pi10000)。

输出格式

如果蒜头君能拼出等边三角形,输出"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;
    }
}

  


 

 

posted @ 2018-02-08 17:03  机智的小白  阅读(413)  评论(0编辑  收藏  举报