题目:和为n的不同自然数乘积最大
n被分成若干个不同自然数的和,求组成n的一组自然数的最大乘积
样例:
- 10 2 3 4
- 20 2 3 4 5 6
- 25 3 4 5 6 7
- 26 3 4 5 6 8
由上述样例,可以看出规律
1 连续自然数
2 首项为2或3
贪心规律:
尽可能地将n(n>4)拆分成从2开始的连续的自然数的和
如果最后有剩余的数,将剩余数优先从最后平分到每一项
例:
n=10,先拆分为:10=2+3+4+1,多余项为1,将其分配给最后一项4,得到10=2+3+5,所以最大的乘积为2*3*5=30.
n=20,拆分为:20=2+3+4+5+6,正好,最大乘积为2*3*4*5*6=720.
n=25 先拆分为:10=2+3+4+5+6+5,多余项为5 ,平分每一项 25=3+4+5+6+7 最大乘积3*4*5*6*7=2520
n=26,拆分为:26=2+3+4+5+6+6,因为多余项为6,将其平均分给前面的项,优先考虑后面的项,即前面的4项各分到1,第5项,分到2,最后是26=3+4+5+6+8,所以最大的乘积为3*4*5*6*8=2880.
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int a[1000];
int n;
int ans=1;
int main()
{
while(~scanf("%d",&n))
{
int sum=0,l=0,left;
for(int i=2;i<=n;i++)//求最大连续
{
a[l++]=i;
sum+=i;
if(sum>n)
{
sum-=i,l--,left=n-sum;
break;
}
}
for(int i=l-1;left;left--)//将多余项平均分配
{
a[i]++;
i--;
if(i<0) i=l-1;
}
for(int i=0;i<l;i++) {
printf("%d ",a[i]);
ans*=a[i];
};
printf("\n%d\n",ans);
}
return 0;
}