思路:
DFS。
注意:
0的阶乘是1;
n=0时 为NO;
#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <fstream>
#include <cmath>
#include <cstring>
#include <limits.h>
#define Long long long
#define uint unsigned int
#define N
#define mod 1000000007
#define inf 100000000
#define eps 1e-10
#define For(i,l,r) for(int i=l;i<=r;i++)
#define Dor(i,r,l) for(int i=r;i>=l;i--)
using namespace std;
int n;
int value[10];
bool used[10];
bool ans = false;
int factorial(int n) {
if(n == 0) return 1;
int sum = 1;
for(int i = 2; i <= n; ++i) {
sum *= i;
}
return sum;
}
void dfs(int x, int sum) {
if(sum < 0) {
return;
}
if(sum == 0) {
ans = true;
return;
}
for(int i = x; i <= 9; ++i) {
if(!used[i]) {
used[i] = true;
dfs(i+1, sum - value[i]);
used[i] = false;
}
}
return;
}
int main(int argc, const char * argv[]) {
for(int i = 0; i <= 9; ++i) {
value[i] = factorial(i);
}
while(cin>>n) {
if(n < 0) return 0;
if(n == 0) {
cout<<"NO"<<endl;
continue;
}
memset(used, false, sizeof(used));
ans = false;
dfs(0, n);
if(ans) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}