DFS复健笔记 - 等边三角形
是的,我在学树剖时发现连 dfs 都不会了。
真菜啊。
题面:A君手上有一些小木棍,它们长短不一,A君想用这些木棍拼出一个等边三角形,并且每根木棍都要用到。 例如,A君手上有长度为 \(1\),\(2\),\(3\),\(3\) 的 \(4\) 根木棍,他可以让长度为 \(1\),\(2\) 的木棍组成一条边,另外 \(2\) 跟分别组成 \(2\) 条边,拼成一个边长为 \(3\) 的等边三角形。判断是否可能。
每次不是边 \(a\) 就是边 \(b\) 就是边 \(c\),考虑从每一个木棍开始分别尝试 \(a\) 边 \(b\) 边 \(c\) 边。
可以特判一下防止无谓 dfs。
#include <iostream>
using namespace std;
int v[1005],all,n,bi;
bool flag=false; //是否可以形成等边三角形
void dfs(int a,int b,int c,int step){
if (a > bi || b > bi || c > bi)return;
if (a == bi&&b == bi){
flag = true;
return;
}dfs(a + v[step], b, c,step+1);
dfs(a, b + v[step], c,step+1);
dfs(a, b, c + v[step],step+1);
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&v[i]),all+=v[i];
if (all%3!=0) return puts("no"),0; //如果总长不为3的倍数,则不可能。因为木棍不可能凑出小数
bi=all/3; //边长
for (int i = 0; i < n; i++) if (v[i] > bi) return puts("no"),0; //如果有一根木棍的长度大于总长的1/3,也不可能。
dfs(0,0,0,0); //深搜一波
if(flag) cout << "yes" << endl;
else cout << "no" << endl;
}

浙公网安备 33010602011771号