[计蒜客(蓝桥杯省赛)]等边三角形 原创
题目来源 计蒜客程序设计竞赛基础课(蓝桥杯省赛)
算法标签 递归,剪枝
题目描述

提示

思路
思路和提示相同,我们很容易就想到只要枚举三遍的长度,符合条件判断为正确即可,剩下的工作就是剪枝。
尽可能设想合法条件做合法性剪枝。
设想两点:
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;
}

浙公网安备 33010602011771号