深度优先搜索 和问题 简单函数递归 “加 还是不加”
2016-03-24 22:40
106 查看
Foj 1106
题目:Sum of Factorials
代码:
dfs一个比较方便的用处,即是可以判断这种类型的题目:部分和问题。
首先第一部分判断是否把所有的节点判断完毕,返回sum==n,如果找到了,返回True,没找到返回False。
第二部分表示:在当前这个节点上,选择不加上该节点所代表的数的值,得到想要的结果,返回True。
第三部分表示:在当前这个节点上,选择加上该节点所代表的数的值,得到想要的结果,返回True。
最后,如果在此时的这个节点,不管这个节点的状态如何,都不会找到想要的值,返回False。
题目: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\n"); continue; } bool t; t=dfs(0,0); if(t)printf("YES\n"); else printf("NO\n"); } 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。
相关文章推荐
- linux中进程管理的三大工具及进程查看命令
- Markdown编辑器的使用
- linux目录结构详解
- Appium——驱动和常用功能的封装
- Java提高之优化篇(待完成)
- C#打印GroupBox控件区域
- Xcode代码块转移备份同步(CodeSnippets)代码块路径
- stm32f10x .icf文件 可以看懂
- Android开发之三种动画
- JavaScript 语言基础知识点总结(思维导图)
- Material Design之TextInputLayout使用示例
- Catalan数计算及应用
- 快速幂运算
- Java基础之容器综述篇
- 右浮动位置问题
- Android入门教程 MediaPlayer教程【使用进度条】
- 算法题的五种解法一——举例法
- 适用于 Mac OS 的 Paragon 驱动程序 | Seagate
- TestNG数据驱动
- 史上最全最强SpringMVC详细示例实战教程