深度优先搜索(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 "); } else { printf("NO "); } } 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; }