2.1.4 部分和问题(深度优先搜索基础)

深度优先搜索(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;	
}

  

原文地址:https://www.cnblogs.com/lbd_smile/p/4435847.html