抽象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逐个搜,找到搜的策略,然后给出边界条件的判断即可求解

posted on 2020-03-15 17:48  二进制dd  阅读(133)  评论(0编辑  收藏  举报

导航