最优分解问题
问题描述:设n是一个正整数,要求将n分解为若干互不相同的自然数之和,且这些自然数的乘积最大。
输入:正整数n
输出:计算的最大乘积。
如输入10,则输出30
若a+b=const ,则a-b的绝对值越小,ab值越大。贪心策略:将n分成从2开始的连续自然数之和,如果最后剩下一个数,则将此数在后项优先的方式下均匀地分给前面各项。
#include<iostream>
using namespace std;
int main() {
int num;
cin >> num;
int a[100] = { 0 };
int k = 2;
int i = 0;
while (num >= k) {
a[i++] = k;
num -= k;
k++;
}
if (num > 0) {
if (num == a[i - 1]) {
a[i - 1]++;
num--;
}
for (int j = i - 1; j >= 0 && num > 0; j--) {
a[j] ++;
num--;
}
}
int max = 1;
for (int j = 0; j < i; j++) {
max = max * a[j];
}
cout << max << endl;
return 0;
}
运行结果