抽象DFS问题
#include<iostream> using namespace std; int n,sum; int num[105]; bool f; bool vis[105]; void dfs(int count,int sum1,int posit){ if(f){ return; }//找到直接返回 if(count==3){ f=true; return; }//找到3根 if(sum1==sum/3){ dfs(count+1,0,0); return; }//找到一根 for(int i=0;i<n;i++){ if(!vis[i]){ vis[i]=1; dfs(count,sum1+num[i],i+1); vis[i]=0; } }//开始逐个搜,是没搜过的,然后标记然后继续搜,取标 } int main(){ cin>>n; for(int i=0;i<n;i++){ cin>>num[i]; sum+=num[i]; } if(sum%3!=0){ cout<<"No!"<<endl; }else{ dfs(0,0,0); if(f){ cout<<"Yes!"<<endl; } } return 0; }
这类问题用DFS逐个搜,找到搜的策略,然后给出边界条件的判断即可求解