poj1775 - Sum of Factorials

来源:互联网 发布:js bind方法带参数 编辑:程序博客网 时间:2024/05/16 09:32

题目大意:给出一个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//最大范围是10class 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!=1for(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;}