深搜之搜索树

来源:互联网 发布:网络咨询师工作流程 编辑:程序博客网 时间:2024/06/05 16:39
给定整数a1、a2、.......an,判断是否可以从中选出若干数,使它们的和恰好为K。
输入:
n=4
a={1,2,4,7}
k=13
输出:
Yes(13=2+4+7)
经典深搜问题:递归代码:
#include <cstdio>int a[30];int n,k;bool dfs(int i,int sum)  //前i项之和sum{    if(i==n)        return sum==k;    if(dfs(i+1,sum))  //放入第i个        return true;    if(dfs(i+1,sum+a[i]))  //不放入第i个        return true;}int main(){    while(~scanf("%d%d",&n,&k))    {        for(int i=0;i<n;i++)            scanf("%d",&a[i]);        if(dfs(0,0))            printf("YES\n");        else            printf("NO\n");    }    return 0;}

如果要求保存相加的每一个数,可以这样实现:
#include <iostream>#include <vector>using namespace std;int a[4]={1,2,4,7},k;vector<int> ans;void dfs(int i,int sum){if(i==4){if(sum==k)   {   for(int i=0;i!=ans.size();i++)cout<<ans[i]<<" ";cout<<endl;return ;   }   else  return ;}dfs(i+1,sum);ans.push_back(a[i]);dfs(i+1,sum+a[i]);ans.pop_back();return ;}int main(){ k=7; dfs(0,0);}


0 0
原创粉丝点击