计蒜客 等边三角形 dfs
题目:
https://www.jisuanke.com/course/2291/182238
思路:
1.dfs(int a,int b,int c,int index)//a,b,c三条边的边长,index是数组的下标
从dfs(0,0,0,0)开始,每次选的长度可能加到a,也可能b,也可能c,
三种可能分别dfs:
dfs(a+len[index+1],b,c,index+1);
dfs(a,b+len[index+1],c,index+1);
dfs(a,b,c+len[index+1],index+1);
2.剪枝
数据太大的边直接结束递归,此题中因为是求等边三角形,对于所有边的和sum,除以三的值肯定是大于等于abc三条边的。
3.提取重复的运算
一开始我sum没有/3,而是在dfs里面/3判断,所以就TLE了。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<queue> 6 using namespace std; 7 //计蒜客 等边三角形 8 int len[25],n; 9 bool ok; 10 int sum; 11 void dfs(int a,int b,int c,int index)//a,b,c三条边的边长,index是数组的下标 12 { 13 if(a>sum||b>sum||c>sum)//剪枝 14 return; 15 if(index>n) 16 return; 17 if(a==b&&b==c&&index==n) 18 { 19 ok=true; 20 return; 21 } 22 23 if(ok) 24 return; 25 26 { 27 dfs(a+len[index+1],b,c,index+1); 28 dfs(a,b+len[index+1],c,index+1); 29 dfs(a,b,c+len[index+1],index+1); 30 } 31 } 32 int main() 33 { 34 while(scanf("%d",&n)==1) 35 { 36 sum=0; 37 for(int i=1;i<=n;++i) 38 { 39 scanf("%d",&len[i]); 40 sum+=len[i]; 41 } 42 ok=false; 43 sum/=3; 44 dfs(0,0,0,0); 45 if(ok) 46 printf("yes\n"); 47 else 48 printf("no\n"); 49 } 50 return 0; 51 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步