最优分解问题
题目
问题描述:设n是一个正整数,要求将n分解为若干互不相同的自然数之和,且这些自然数的乘积最大。
输入
正整数n
输出
计算的最大乘积。
如输入10,则输出30.
提示:若a+b=const,则a-b的绝对值越小,ab值越大。贪心策略:将n分成从2开始的连续自然数之和,如果最后剩下一个数,则将此数在后项优先的方式下均匀地分给前面各项。
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int j,k,n,count;
int index=0,sum=0;
int i=2;
int a[100]={
0};
a[2]=2;
scanf("%d",&n);
while(n-sum>=i) {
//从2开始,对n进行分解
sum+=i;
a[i]=i;
i++;
index++;
}
int p=(n-sum)/index; //全部累加
int q=(n-sum)%index; //从后往前,加最后剩余的
for(j=i-1;j>=2;j--) {
a[j]+=p;
}
for(k=i-1;k>i-1-q;k--) {
a[k]++;
}
int max = 1;
for(j=2;j<index+2;j++) {
max = max * a[j];
}
cout<<max<<endl;
}