贪心算法之最优分解问题
题目描述
设n是一个正整数,现在要求将n分解为若干个互不相同的自然数的和,使这些自然数的乘积最大。
数据分析
输入
10
输出
30
分析
1.根据根绝均值不等式的成立条件可知,若 a + b = const,则 |a - b| 越小,a·b越大。
2.当 n < 4 时:对n的分解的乘积是小于n的,应该选择不分解。
当 n >= 4时:n = 1 + (n - 1) < n,所以至少要从2开始分解,可以保证乘积大于n,即越分解乘积越大。
3.如果最后剩下的数字小于前一个,就要平均分配给前面的数字,要从后往前分,反之可能会产生重复数字
#include<iostream> #include<vector> using namespace std; //将n分解为若互不相同的自然数的和 使他们的乘积最大 #define Max 100005 int main(){ int n; cin>>n; if(n<4) { cout<<4<<endl; return 0; } int arr[Max]={}; int m=n; // arr[0]=2; int c=2; int i; for( i=0;c<=m;i++){ arr[i]=c; m-=c; c++; } int cou=i;//一共有几个数 //如果有剩余的数 就从后往前平均分配到前的数字上 int avg = m/cou; int ex = m%cou; while(i){ arr[i]+=avg; if(ex) { arr[i]+=1; ex--; } i--; } int mul=1; for(int i=0;i<cou;i++){ mul*=arr[i]; } cout<<mul; }
下一篇:
720. 词典中最长的单词