找到{E1,... En}(E1 + E2 + .. En = N,N给出),具有E1 * E2 * .. En为最大值的以下属性

时间:2012-03-07 09:28:34

标签: c++ algorithm math

给定数字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 个答案:

答案 0 :(得分:4)

不需要算法,数学直觉可以独立完成:

步骤1:证明数字大于3的结果集最多只有3和2的结果集

如果结果集中有任何数字 x ,可以考虑将它分成两个数字是否更好。

总和应该仍然是 x

  • x 为偶数时, t x - t )的最大值在 t = x / 2,除特殊情况 x = 2外,它大于 x ,并且对于特殊情况 x = 4,等于x(见注1)。
  • x 为奇数时, t x - t )的最大值在 t =( x ±1)/ 2。

这表明了什么?只有你在最后一组中应该只有3和2,否则它不是最理想的(或等同于最佳组合)。

第2步:你应该拥有尽可能多的3个

现在,如3²> 2³,只要余数不是1,你就应该有尽可能多的3。

结论:对于每个N> = 3:

  • 如果N = 0 mod 3,则结果集仅为3
  • 如果N = 1 mod 3,则结果集有一对2(或4),其余为3
  • 如果N = 2 mod 3,则结果集为1,其余为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方法的复杂性。