阶乘之和-DFS
来源:互联网 发布:java 构造方法 public 编辑:程序博客网 时间:2024/05/16 17:12
阶乘之和
时间限制:3000 ms | 内存限制:65535 KB
难度:3
- 描述
给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2!+3!,如果是,则输出Yes,否则输出No;
- 输入
- 第一行有一个整数0<m<100,表示有m组测试数据;
每组测试数据有一个正整数n<1000000; - 输出
- 如果符合条件,输出Yes,否则输出No;
- 样例输入
2910
- 样例输出
YesNo
- 代码:
#include <cstdio>#include <iostream>using namespace std;int a[20];int n;//此题可以转化为部分和问题,相当于从a1, a2, a3....an中选取若干个数,使它们的和为k void factorial(int n) { //求出从1到10每个数的阶乘,保存在数组a中 int res = 1;for(int i = 1; i <= n; i++) {res = res*i;a[i - 1] = res;}}//已经从前i项中得到了和sum,然后对于i项之后的进行分支 bool dfs(int i, int sum) {//如果前10(因为数组是从0到9)项都计算过了,则返回sum是否与k相等 if(i == 9) return sum == n;//不加a[i]的情况 if(dfs(i+1, sum)) return true;//加上a[i]的情况 if(dfs(i+1, sum + a[i])) return true;//无论是否加上a[i]都不能凑成k就返回false return false;}int main(){factorial(10); //因为10的阶乘已经远远超过一百万了,所以只需求到10的阶乘即可 int T;cin >> T;while(T--) {cin >> n;if(dfs(0, 0)) printf("Yes\n");else printf("No\n");}return 0;}
0 0
- 阶乘之和-DFS
- 阶乘之和【DFS】【贪心】
- nyoj91 阶乘之和 简单DFS
- 阶乘之和 【DFS】 or【 贪心】
- 阶乘之和
- 阶乘之和
- 阶乘之和
- 阶乘之和
- 【阶乘之和】
- 阶乘之和
- 阶乘之和
- 阶乘之和
- 阶乘之和
- 阶乘之和
- 阶乘之和
- 阶乘之和
- 阶乘之和
- 阶乘之和
- C#后台操作Cookie给密码框赋值的问题
- 这些图片太形象了,很快就记住了 很多单词
- 不用Cookie的“Cookie”技术
- 某校赛题(dp + 状态压缩)
- 那两年炼就的Android内功修养
- 阶乘之和-DFS
- 网络拥塞控制---传统TCP存在的缺陷
- Android多线程之图解Handler Looper MessageQueue Message
- AD6中如何单独设置覆铜间距
- 成为优秀高级程序员的10个要点
- 下标运算符
- Axure ---界面原型工具
- 做人——外圆内方
- linux内核学习-3 init函数(关注新浪微博:寂寞侵蚀的岁月(4000多篇技术分享))