[计蒜客(蓝桥杯省赛)]等边三角形 原创

题目来源 计蒜客程序设计竞赛基础课(蓝桥杯省赛)

算法标签 递归,剪枝

题目描述

在这里插入图片描述

提示

在这里插入图片描述

思路

思路和提示相同,我们很容易就想到只要枚举三遍的长度,符合条件判断为正确即可,剩下的工作就是剪枝。

尽可能设想合法条件做合法性剪枝。
设想两点:
1.因为所有长都需要用到,所以任何一长不大于等边边长
2.总长%3!=0,等边三角形不出现小数

题目代码

#include<iostream>

using namespace std;

const int N=21;
int n,len[N],sum;
bool flag;

void dfs(int l1,int l2,int l3,int i)
{
  if(l1>sum||l2>sum||l3>sum)return;
  if(l1==sum&&l2==sum){flag=true;return;}//l3=sum-l1-l1,三遍都等于等边边长
  
  dfs(l1+len[i],l2,l3,i+1);//边1
  dfs(l1,l2+len[i],l3,i+1);//边2
  dfs(l1,l2,l3+len[i],i+1);//边3
}
int main()
{
  int n;
  cin>>n;
  
  for(int i=0;i<n;i++)cin>>len[i],sum+=len[i];

  if(sum%3){cout<<"no";return 0;}//不是小数
	
	for(int i=n;i;i--)if(len[i]>sum/3){cout<<"no";return 0;}//任何一长度不大于边长
  
  sum/=3;//取到等边边长
  dfs(0,0,0,0);

  if(flag)cout<<"yes";else cout<<"no";
  
  return 0;
}
posted @ 2023-09-30 11:10  俺叫西西弗斯  阅读(0)  评论(0)    收藏  举报  来源