• 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;	
    }
    

      

  • 相关阅读:
    关于消息队列的使用
    关于Redis中交互的过程
    关于Redis的启动过程
    【分布式】Zookeeper与Paxos
    【分布式】Chubby与Paxos
    【分布式】一致性协议
    【分布式】分布式架构
    【知识积累】try-catch-finally+return总结
    【面试】判断一棵二叉树是否为二叉排序树
    【面试】用两个栈实现队列
  • 原文地址:https://www.cnblogs.com/lbd_smile/p/4435847.html
Copyright © 2020-2023  润新知