阶乘之和-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
原创粉丝点击