POJ 1775 Sum of Factorials (ZOJ 2358)

探讨了如何判断一个整数是否能被拆分为若干个阶乘之和的问题,提供了两种解决方案:一种采用深度优先搜索(DFS),另一种采用贪心算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}



转载于:https://www.cnblogs.com/murmured/p/5004188.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值