n被分成若干个不同自然数的和,求组成n的一组自然数的最大乘积

题目:和为n的不同自然数乘积最大

n被分成若干个不同自然数的和,求组成n的一组自然数的最大乘积

样例:

  1. 10    2 3 4 
  2. 20    2 3 4 5 6
  3. 25    3 4 5 6 7
  4. 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;
}

猜你喜欢

转载自blog.csdn.net/behboyhiex/article/details/82496359