描述

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

输入

第一行有一个整数0<m<100,表示有m组测试数据;
每组测试数据有一个正整数n<1000000;

输出

如果符合条件,输出Yes,否则输出No;

样例输入

2910

样例输出

YesNo

 

1:简单做法:

 

#include<iostream>
using namespace std;
typedef long long ll;
ll a[20];
void tt(){
	ll l=1;
	for(ll i=1;i<=10;i++){
		 l*=i;
		 a[i]=l;
	}
}

int main(){
	tt();a
	int t;
	cin>>t;
	ll n;
	while(t--){
		cin>>n;
		ll p=n;
		for(ll i=10;i>=1;i--){
			if(p>=a[i]){
				p-=a[i];
			}
		}
		if(p==0)
		cout<<"Yes"<<endl;
		else
		cout<<"No"<<endl;
	}
	return 0;
}

2:回溯

#include<iostream>
using namespace std;
int a[20];
int n;
void tt(){
	int l=1;
	for(int i=1;i<=10;i++){
		 l*=i;
		 a[i]=l;
	}
}
bool dfs(int i,int sum){
	if(i==10) return sum==n;
	if(dfs(i+1,sum)) return true;
	if(dfs(i+1,sum+a[i])) return true;
	return false;
}
int main(){
	tt();
	int t;
	cin>>t;
	while(t--){
	  cin>>n;
	  if(dfs(0,0))
	  cout<<"Yes"<<endl;
	  else
	  cout<<"No"<<endl;
	}
	return 0;
}