题解 | Sum of Factorials
#include <bits/stdc++.h>
using namespace std;
//10!=3628800,已经超越目标,所以结果的和必然在这个范围内,
int factorials[] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880};
int main() {
int n;
while (cin >> n) {
int k = 9;
while (factorials[k] > n)k--;
int flag = -1;
for (; k >= 0; k--) {
if (n >= factorials[k])n -= factorials[k];
}
if (n == 0) {
flag = 1;
}
if (flag == 1)cout << "YES" << endl;
else cout << "NO" << endl;
}
}
注意到,常见阶乘里面15!=1.3076744e+12,经常作为无法处理的极限,这里自然不可能很大的阶乘,且实际上的运算要求中不允许出现重复应用的问题,他既然要实现组装成功,就必然要采用最大到最小的方式,否则是不可能的,然后就可以一次遍历迅速的依靠已知的阶乘结果迅速的得到结果。当然本体的本质来说可以采用背包问题来求解

查看1道真题和解析