等邊三角形
阿新 • • 發佈:2018-12-18
蒜頭君手上有一些小木棍,它們長短不一,蒜頭君想用這些木棍拼出一個等邊三角形,並且每根木棍都要用到。 例如,蒜頭君手上有長度為 11,22,33,33 的4根木棍,他可以讓長度為11,22 的木棍組成一條邊,另外 22 跟分別組成 22 條邊,拼成一個邊長為 33 的等邊三角形。蒜頭君希望你提前告訴他能不能拼出來,免得白費功夫。
輸入格式
首先輸入一個整數 n(3≤n≤20)n(3≤n≤20),表示木棍數量,接下來輸入 nn 根木棍的長度 pi(1≤pi≤10000)pi (1≤pi≤10000)。
輸出格式
如果蒜頭君能拼出等邊三角形,輸出"yes"
,否則輸出"no"
。
樣例輸入1
5 1 2 3 4 5
樣例輸出1
yes
樣例輸入2
4 1 1 1 1
樣例輸出2
no
#include<iostream> #include<vector> #include<cstdio> #include<cstdlib> #include<string> #include<cstring> #include<algorithm> #include<set> #include<list> #include<stack> #include<cctype> #include<map> #include<queue> using namespace std; int n,k; int a[25]; int edge=0,flag=0; void dfs(int i,int x,int y,int z) { if(x>k||y>k||z>k) return ; if(i>=n||flag) return ; if(x==k&&y==k) { flag=1; cout<<"yes"<<endl; return ; } dfs(i+1,x+a[i],y,z); dfs(i+1,x,y+a[i],z); dfs(i+1,x,y,z+a[i]); // return 0; } int main() { int sum=0; cin>>n; for(int i=0;i<n;i++) { cin>>a[i]; sum+=a[i]; } sort(a,a+n); k=sum/3; if(sum%3!=0) { cout<<"no"<<endl; return 0; } for(int j=0;j<n;j++) { if(a[j]>k) { cout<<"no"<<endl; return 0; } } dfs(0,0,0,0); if(!flag) cout<<"no"<<endl; return 0; }