给定数字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
答案 0 :(得分:4)
不需要算法,数学直觉可以独立完成:
如果结果集中有任何数字 x ,可以考虑将它分成两个数字是否更好。
总和应该仍然是 x 。
这表明了什么?只有你在最后一组中应该只有3和2,否则它不是最理想的(或等同于最佳组合)。
现在,如3²> 2³,只要余数不是1,你就应该有尽可能多的3。
结论:对于每个N> = 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)有效
答案 1 :(得分:1)
这不是一个完整的解决方案,但可能有所帮助。
首先请注意,如果您修复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数,也称为Euler数,e = 2.71828 ....)。因此,我寻找一个解决方案,其中n = floor(N / e)或n = floor(N / e)+1,然后选择所有E_i等于N / n或N / n + 1,如上所述。
希望有所帮助。
答案 2 :(得分:0)
整数序列的在线Encycolpedia为此问题的解决方案提供了recurrence relation。
我会把它留给其他人来比较复杂性。不确定我能否弄清楚OP方法的复杂性。