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;
}
posted @ 2020-06-17 23:24  Inversentropir-36  阅读(208)  评论(0)    收藏  举报