找到{E1,.En}(E1+E2+.En=N,给定N),具有以下性质,即E1*E2*.En是最大值
Find {E1,..En} (E1+E2+..En=N, N is given) with the following property that E1* E2*..En is Maximum
给定数字N,编写一个程序来计算数字E1、E2。。。En具有以下属性:
1) N=E1+E2+…+En
2) E1*E2*。。。En是最大值
3) E1.En是整数。无负值:)
你会怎么做?我有一个基于divide et impera的解决方案,但我想检查它是否是最优的。
Example: N=10
5,5 S=10,P=25
3,2,3,2 S=10,P=36
不需要算法,数学直觉可以自己完成:
第一步:证明数字大于3的结果集至多与只有3和2的结果集一样好
给定结果集中的任何数字x,人们可能会考虑将其划分为两个数字是否更好。
总和应该仍然是x。
- 当x为偶数时,当t=x/2时,达到t(x-t)的最大值,并且除特殊情况x=2外,它大于x-,对于特殊情况x=4,等于x(见注释1)
- 当x为奇数时,当t=(x±1)/2时,达到t(x-t)的最大值
这显示了什么?只是你的最终集合中应该只有3和2,因为否则它是次优的(或等同于最优集合)。
第二步:你应该有尽可能多的3
现在,作为3²>2³,只要余数不是1,就应该有尽可能多的3。
结论:对于每N>=3:
- 如果N=0 mod 3,则结果集仅为3
- 如果N=1 mod 3,则结果集有一对2(或4),其余为3
- 如果N=2 mod 3,则结果集有一个2,其余为3
请更正此帖子。我写结构良好的数学证明的时代已经很遥远了。。。
注1:(2,4)是唯一一对不同的整数,因此x^y=y^x。你可以用来证明这一点
x^y = y^x
y ln(x) = x ln(y)
ln(x)/x = ln(y) / y
函数ln(t)/t
在其全局最大值后严格递减,达到2和3之间,所以如果您想要两个不同的整数,使得ln(x)/x = ln(y)/y
,其中一个必须小于或等于2。由此可以推断出只有(2,4)有效
这不是一个完整的解决方案,但可能会有所帮助。
首先要注意的是,如果你固定n,并且E_i和E_j中的两个项相差不止一个(例如3和8),那么你可以通过尽可能多地"均衡"它们来做得更好,也就是说,如果数字p=E_i+E_j是偶数,那么你就可以用p/2来更好地处理这两个项。如果p是奇数,那么用p/2和p/2+1(其中/是整数除法)替换它们会做得更好。
也就是说,如果你知道最佳项数n是多少,你就可以做到:让所有E_i都等于n/n和n/n+1(同样是整数除法),所以它们的和仍然是n(这现在是一个简单的问题)。
所以现在的问题是什么是最优的n。假设现在允许你使用实数。那么每个项的解都是N/N,你可以把乘积写成(N/N)^N。如果你把它与n进行微分并找到它的根,你会发现n应该等于n/e(其中e是Neper数,也被称为欧拉数,e=2.71828……)。因此,我会寻找一个n=floor(n/e)或n=flor(n/m)+1的解,然后选择所有等于n/n或n/n+1的e_I,如上所述。
希望能有所帮助。
整数序列在线百科全书为该问题的解决方案提供了递归关系。
我会让其他人来比较复杂性。我不确定OP的方法有多复杂。
- C++ std::locale( "en" ) 在 iOS 上引发异常
- 将列表 en 列表迭代器作为指针 C++ 传递
- 错误 C2440:"=":无法从 'char *(__cdecl *)(int,int)' 转换为 en 'GetItemText_t'
- JsonCpp:如何在 Json::Value 中获取 en 空对象
- 在浏览器中创建由 en 事件调用的 C# 窗口服务
- 如何在 c++ STL 文件读取期间可移植地捕获和处理 UTF "EN DASH"缺点?
- 我们如何将编写的项目 en C ++转换为DLL文件
- 找到{E1,.En}(E1+E2+.En=N,给定N),具有以下性质,即E1*E2*.En是最大值
- 与c++中的字节、块、en-/解码混淆