zoukankan      html  css  js  c++  java
  • 深度优先搜索 和问题 简单函数递归 “加 还是不加”

    Foj 1106
    题目:Sum of Factorials

    代码:

    #include<cstdio>
    #include<iostream>
    #include<stdlib.h>
    #include<string.h>
    int n;
    int store[11]={1,1,2,6,24,120,720,5040,40320,362880};
    bool dfs(int i,int sum)//9个节点 每个节点两个状态 
    {
    	if(i==10)return sum==n;//到底 
    	
    	if(dfs(i+1,sum))return true;//这个节点不加 找到 
    	
    	if(dfs(i+1,sum+store[i]))return true;//这个节点加 找到 
    	
    	return false;//都没找到 
    }
    int main()
    {
    
    	while(scanf("%d",&n)!=EOF)
    	{
    		if(n<0)break;
    		if(n==0)
    		{
    			printf("NO
    ");
    			continue;
    		}
    		
    		bool t;
    		t=dfs(0,0);
    		
    		if(t)printf("YES
    ");
    		else printf("NO
    ");
    	}
    	return 0;
    }
    

    “加或不加”核心部分

    int store[11]={1,1,2,6,24,120,720,5040,40320,362880};
    bool dfs(int i,int sum)//9个节点 每个节点两个状态 
    {
    	if(i==10)return sum==n;//到底 
    	
    	if(dfs(i+1,sum))return true;//这个节点不加 找到 
    	
    	if(dfs(i+1,sum+store[i]))return true;//这个节点加 找到 
    	
    	return false;//都没找到 
    }
    

    dfs一个比较方便的用处,即是可以判断这种类型的题目:部分和问题
    首先第一部分判断是否把所有的节点判断完毕,返回sum==n,如果找到了,返回True,没找到返回False。

    第二部分表示:在当前这个节点上,选择不加上该节点所代表的数的值,得到想要的结果,返回True。

    第三部分表示:在当前这个节点上,选择加上该节点所代表的数的值,得到想要的结果,返回True。

    最后,如果在此时的这个节点,不管这个节点的状态如何,都不会找到想要的值,返回False。

  • 相关阅读:
    css3 画小蜜蜂
    css3 绘制书本
    JavaScript 封装插件学习笔记(一)
    Jquery 多行拖拽图片排序 jq优化
    可输入式下拉框
    竖向展开式菜单
    checkbox 全选或取消
    JQuery.lazyload 图片延迟加载
    轻量级弹出框 lightbox
    onoffswitch-checkbox
  • 原文地址:https://www.cnblogs.com/qq952693358/p/5317597.html
Copyright © 2011-2022 走看看