最优分解问题

将整数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;

}

 

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