将整数n分成若干互不相同的自然数和,且使得自然数的乘积最大。
对于任意的实数x若分成两份,什么条件下能得到两份乘积比x大呢?
由 (x/2)^2 > x 得到 x > 4 ,那么也就是说如果不考虑是否互不相同的问题的话,一个整数n不断分成两份,分完后两部分持续分,直到不能再分为止,将得到最大乘积。
由上面的结论可以得到,分的乘积项越多,积越大。为了满足这个条件以及互不相同的条件,我们肯定是从2,3,4,5,有小到大逐个贪心选取,如此方能满足无重复项,且项数最多。
但是可能最后余下一些余数,如何分配这些余数才能使得乘积最大呢?由数学知识很容易想到,乘积项越接近肯定值越大,考虑将余数均摊给前面,可是如果先给前面的,势必又会产生重复问题,故而,从后往前逐个均摊。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000;
int a[maxn];
int main()
{
int n;
scanf("%d",&n);
if(n <= 4) {
printf("%d\n",n);
return 0;
}
int cur = 2,m = n;
for(int i = 1; i <= n; i++)
{
if(m >= cur) m-=cur;
else break;
cur++;
}
int ans = 1;
for(int i = cur-2; i >= 1; i--)
{
if(m){
ans *= i+2;
m--;
}
else ans *= i+1;
}
printf("%d\n",ans);
return 0;
}