POJ 1775 Sum of Factorials (ZOJ 2358)

50 篇文章 0 订阅

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");
		else
			printf("NO\n");
	}
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值