最優分解問題

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

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章