c语言 ACM:Dio 的面包工坊

描述
Dio 是荒木庄的面包师傅,和手部美容师 Bo 良 Ki 影是好朋友。Bo 良 Ki 影会在每个月的某一天来买注入爱心的小面包。面包的爱心总值是爱心小面包的乘积。这个月 Dio 会把 n个爱心值分配到许多个爱心小面包中,为了给好朋友 Bo 良 Ki 影最大的爱心总值,他要如何分配呢?

注意:爱心总值可能很大,请使用 long long 存储答案。

输入
第一行输入一个整数 T (1≤T≤1000),表示有 T 组数据。

每组数据输入一个整数 n (1≤n≤100),表示 Dio 的爱心值。

输出
每组数据输出一个整数,表示最大的爱心总值。

样例
输入复制
2
3
4
输出复制
3
4

思路

先从1逐个列举,发现从1-3把爱心值只分给一个面包才会爱心总值最大,所以输出原数,当数字大于3后,就要进行分给多个面包才能得到最大的爱心总值。
例如5:23=6>14,例如8:3*(5:23=6)=18,例如9:33*3=27…,所以分两类,大于三和小于等于3。

当大于3时,即从4开始,每个a[w]值进行乘积的最大值赋值,当w==n的时候,a[w]和a[n-w]都是在前面进行计算过的,都是乘积最大化过了,所以不会像递归一样一直带入函数里去一直循环计算每一个值的最大乘积值。

#include
long long int fenjie(long long int n);
int main()
{
	long long int sum;
	int i,T,n;
	scanf("%d",&T);
	for(i=1;i<=T;i++)
	{
		scanf("%d",&n);
		sum=fenjie(n);
		printf("%lld\n",sum);
	}
	return 0;
}
long long int fenjie(long long int n)
{
	long long int a[1000];//自动初始化为0;
	int m,w;
	if(n<=3)
	{
		return a[n];
	}
	else
	{
		//不要递归,会运行超时
//		long long int max;
//		max=fenjie(1)*fenjie(n-1);
//		for(m=1;m<=n/2;m++)
//		{
//			if(fenjie(m)*fenjie(n-m)>max)
//			{
//				max=fenjie(m)*fenjie(n-m);
//			}
//		}


//大于4的每个数都进行同样的乘积最大化处理,
		for(w=4;w<=n;w++)
		{
			for(m=1;m<=w/2;m++)
			{
				if(a[w]<a[m]*a[w-m])
				{
					a[w]=a[m]*a[w-m];
				}
			}
		}
	}
		return a[n];
	}

你可能感兴趣的:(c算法,acm竞赛)