將整數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;
}