zoukankan      html  css  js  c++  java
  • 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;	
    }
    

      

  • 相关阅读:
    UVA 11019 Matrix Matcher ( 二维字符串匹配, AC自动机 || 二维Hash )
    蓝桥杯 修改数组 (巧用并查集)
    luoguP3242 [HNOI2015]接水果
    CF757F Team Rocket Rises Again
    luoguP2597 [ZJOI2012]灾难
    luoguP4103 [HEOI2014]大工程
    luoguP3233 [HNOI2014]世界树
    luoguP2495 [SDOI2011]消耗战
    CF613D Kingdom and its Cities
    51nod 1584 加权约数和
  • 原文地址:https://www.cnblogs.com/lbd_smile/p/4435847.html
Copyright © 2011-2022 走看看