问题描述
设n是一个正整数,要求将n分解为若干互不相同的自然数之和,且这些自然数的乘积最大。
输入:正整数n
输出:计算的最大乘积。
样本用例:
如输入10,则输出30.
提示:若a+b=const ,则a-b的绝对值越小,ab值越大。
贪心策略:将n分成从2开始的连续自然数之和,如果最后剩下一个数,则将此数在后项优先的方式下均匀地分给前面各项
源代码:
#include<iostream>
#include<vector>
using namespace std;
int main() {
int n,re=0,sum,count=2;
vector<int>arr(100);
arr[0] = 2;
cin >> n;
re = n - 2;
int i = 1;
while(i){
count = count + arr[i - 1] + 1;//下一个数比上一个数多1
if (count<=n) {//所有数累加和不得大于原有数n
arr[i] = arr[i - 1] + 1;//存入符合要求的数
re = re - arr[i];//更新剩余数
}
else
break;
i++;
}
int num = i;//保存数组元素个数
for (int j = re; j > 0; j--) {//从数组尾部向首部平均分配剩余数
arr[i-1] = arr[i-1] + 1;
i--;
re--;
if (i == 0 && re != 0) {//数组中的每一个元素都分一遍后还有剩余数,则取剩余数继续以上步骤
j = re+1;//+1的原因是循环后面会j--,为了保证剩余数不变,故加1
i = num;
}
}
sum = arr[0];
for (int k = 1; k <num; k++) {//累乘
sum = sum * arr[k];
}
cout << sum << endl;
return 0;
}