正整数n分解成若干个个不同的自然数之和,使得乘积最大

要使加数乘积最大,那么所有的加数要尽可能接近。所以设n的加数如下:

2+3+…+m+k;m为最大加数,k为剩余的数(k<=m);然后把k分到其他数中,策略就是从m->2的数值一次加一,直至把k消耗完。

要使加数乘积最大,那么所有的加数要尽可能接近。所以设n的加数如下:
2+3+…+m+k;m为最大加数,k为剩余的数(k<=m);然后把k分到其他数中,策略就是从m->2的数值一次加一,直至把k消耗完。
#include 
#include 
#include 
#include 
#include 
using namespace std;
typedef long long ll;

int main()
{
    int n;
    cin>>n;
    int  sh,x,sum=0;
    for(x=2;;x++){
        if(sum+x>n)break;
        sum+=x;
    }
    x--;//出去剩余的数的最大加数
    sh=n-sum;//剩余的数
    ll ans=1;
    if(sh==x){//如果剩余的数等于最大加数
        ans*=(x+2);//最大加数加2,因为平分一轮后还剩一个
        sh-=2;
        x--;
    }
    //把剩余的平分完
    while(sh){
        sh--;
        ans*=(x+1);
        x--;
    }
    //处理没有平分到的
    while(x>=2){
        ans*=x;
        x--;
    }
    cout<

 

你可能感兴趣的:(算法设计与分析)