c++ - 求 {E1,..En} (E1+E2+..En​​=N, N is given) 具有以下性质 E1* E2*..En 是最大值

标签 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

最佳答案

不需要算法,数学直觉可以自己搞定:

第 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,则结果集有一个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) 有效

关于c++ - 求 {E1,..En} (E1+E2+..En​​=N, N is given) 具有以下性质 E1* E2*..En 是最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9598766/

相关文章:

将字符串拆分为标记并计算元音的 C 程序

algorithm - 在具有特定限制的情况下查找网格中的路径数

c++ - 如何使用 Boost 库实现 SortedVector API?

c++ - 命名(通用)线程安全数据结构?

algorithm - 如何输出代码本身?

javascript - 构造一圈嵌套方 block

python - 计算所选元素为最大值的子数组的数量

c# - 为什么 .NET 在 String.Format 中使用与默认 Math.Round() 算法不一致的舍入算法?

c++ - c++客户端和node.js服务器示例

c++ - 我可以强制 C++ 库使用单线程吗?