题目大意:给出一个n,问n是否可以由一些阶乘的和组成,如果可以输出YES,否则输出NO,输入
-1代表结束
解题思路:因为n不超过1,000,000,所以我们算一下当n = 9的时候9!= 362880,那么即10!会
大于1000000,所以阶乘最大也是9!,所以我们将1-9的阶乘打表,然后利用背包或者是暴利搜索
都可以很容易解决这个问题。
#include <iostream>
using namespace std;
#define MAXF 10 //最大范围是10
class CFac{
public:
CFac(int n);
CFac();
~CFac();
void SetAns(int n);
int Run(int cur,int sum);
private:
int m_nAns;
int m_nFacArr[MAXF];
};
CFac::CFac(){
m_nFacArr[0] = 1; //特殊,0!=1
for(int i = 1;i < MAXF;i++){ //打表计算1 - 9的阶乘
m_nFacArr[i] = m_nFacArr[i - 1] * i;
}
}
CFac::CFac(int n){
CFac();
m_nAns = n;
}
void CFac::SetAns(int n){
m_nAns = n;
}
int CFac::Run(int cur,int sum){ //深搜解决
if(sum == m_nAns) return 1;
if(cur >= MAXF) return 0;
if(sum > m_nAns) return 0;
if(Run(cur+1,sum+m_nFacArr[cur])) return 1;
return Run(cur+1,sum);
}
CFac::~CFac(){
}
int main(){
int n;
CFac fac;
while(cin>>n){
if(n < 0) break;
if(n == 0){
cout<<"NO"<<endl;
continue;
}
fac.SetAns(n);
if(fac.Run(0,0)){
cout<<"YES"<<endl;
}else{
cout<<"NO"<<endl;
}
}
return 0;
}