深度优先搜索(DFS,Depth-First Search)是搜索的手段之一。它从某个状态开始,不断地转移状态直到无法转移,然后回退到前一步的状态,继续转移到其他状态,如此不断重复,直至找到最终的解。例如求解数独,首先在某个格子内填入适当的数字,然后再继续在下一个格子内填入数字,如此继续下去。如果发现某个格子无解了,就放弃前一个格子上选择的数字,改用其他可行的数组。根据深度优先搜索的特点,采用递归函数实现比较简单。
深度优先搜索从最开始的状态出发,遍历所有可以到达的状态。由此可以对所有的状态进行操作,或者列举出所有的状态。
我的思路:
采用递归思想,自己做一步,然后调用自己,设置出口,直至问题解决。
一分为二,加这个数,或者不加这个数,即:dfs(i+1,sum+a[i],n,k) 或者 dfs(i+1,sum,n,k)
我的代码:
#include<stdio.h>
#define MAX_N 30
int a[MAX_N];
bool dfs(int i,int sum,int n,int k);
int main(void)
{
int i,k,n;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&k);
if(dfs(0,0,n,k))
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
bool dfs(int i,int sum,int n,int k)
{
if(n==i)
{
return sum==k;
}
if(dfs(i+1,sum,n,k))
{
return true;
}
if(dfs(i+1,sum+a[i],n,k))
{
return true;
}
return false;
}