阶乘之和【DFS】【贪心】

来源:互联网 发布:淘宝单坑产出什么意思 编辑:程序博客网 时间:2024/06/05 08:24

阶乘之和

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
描述

给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2!+3!,如果是,则输出Yes,否则输出No;

输入
第一行有一个整数0<m<100,表示有m组测试数据;
每组测试数据有一个正整数n<1000000;
输出
如果符合条件,输出Yes,否则输出No;
样例输入
2910
样例输出

YesNo


代码

DFS

#include<stdio.h>
02.#include<string.h>
03.#include<algorithm>
04.#include<queue>
05.#include<stack>
06.#include<math.h>
07.#include<vector>
08.#define inf 0x3f3f3f
09.#define PI acos(-1);
10.#define LL long long
11.#define M  11
12.#define mod  1000000
13.using namespace std;
14.int num[M]={0};
15.int n;
16. 
17.int flage;
18.void dfs(int j,int sum)
19.{
20.if(sum==n)
21.{
22.flage=1;
23.return ;   
24.}
25.for(int i=j+1;sum<n&&i<M;i++)
26.{
27.dfs(i,sum+num[i]); 
28.}
29.}
30.int main()
31.{
32.int  t;
33.scanf("%d",&t);
34.int s=1;
35.for(int i=1;i<M;i++)
36.{
37.s=s*i;
38.num[i]=s;
39. 
40.}
41.while(t--)
42.{
43.scanf("%d",&n);
44.flage=0;
45.dfs(0,0);
46.if(flage) printf("Yes\n");
47.else printf("No\n");
48.}  
49.return 0;
50.}

贪心

#include<iostream>
02.using namespace std;
03. 
04.int main()
05.{
06.int n;
07.int k[9]={1,2,6,24,120,720,5040,40320,362880};
08.cin>>n;
09.while(n--)
10.{
11.bool flag=false;
12.int m;
13.cin>>m;
14.for(int i=8;i>=0;i--)
15.{
16.if(m>=k[i] && m>0)
17.m-=k[i];
18.if(m==0)
19.flag=true;
20.}
21.if(flag)
22.cout<<"Yes"<<endl;
23.else
24.cout<<"No"<<endl;
25.}
26.}

0 0
原创粉丝点击