POJ 1775 Sum of Factorials (ZOJ 2358)

来源:互联网 发布:sql语句查询列 编辑:程序博客网 时间:2024/06/05 09:47

http://poj.org/problem?id=1775

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1334

题目大意:

给一个数n看看n是否能够拆成几个阶乘的和

如9=1!+2!+3!


方法一:

最初想法是直接打出0~10的阶乘,10的阶乘已经大于n的范围

然后DFS,也过了。不过时间好惨。。。

注意n=0输出NO和0!=1

#include<cstdio>#include<cstring>const int MAXN=10;int temp[12]={1,1};bool used[12];bool ok;void dfs(int cur,int sum,int target){if(sum >target)return;if(sum==target){ok=true;return ;}for(int i=cur;i<=MAXN;i++){if(used[i]==false){used[i]=true;dfs(i,sum+temp[i],target);used[i]=false;}}}int main(){for(int i=2;i<=MAXN;i++)temp[i]=temp[i-1]*i;int n;while(scanf("%d",&n),n>=0){if(n==0){printf("NO\n");continue;}memset(used,0,sizeof(used));ok=false;dfs(0,0,n);if(ok)              printf("YES\n");          else              printf("NO\n");  }return 0;}


方法二:

贪心。。

然后把不超过n的阶乘减去。

因为n! >= sum(1 ! + 2!+……n-1!)

#include<cstdio>const int MAXN=10;int main(){int temp[12]={1,1};for(int i=2;i<=MAXN;i++)temp[i]=temp[i-1]*i;int n;while(scanf("%d",&n),n>=0){if(n==0){printf("NO\n");continue;}for(int i=MAXN;i>=0;i--){if(n >=temp[i])n-=temp[i];}if(n==0)printf("YES\n");elseprintf("NO\n");}return 0;}



0 0
原创粉丝点击