自然数最优分解问题(纯分析)

来源:互联网 发布:淘宝美工的价格 编辑:程序博客网 时间:2024/04/29 13:52
【问题】
设 n 是一个正整数。现要求将 n 分解为若干个自然数的和,且使这些自然数的乘积最大。
对于给定的正整数 n,编程计算最优分解方案。
【输入】
由文件 input.txt 提供输入数据。文件的第 1 行是正整数 n。
【输出】
程序运行结束时,将计算出的最大乘积输出到文件 output.txt 中。
【样例】
input:
10
output:
36

【分析】by rappizit@yahoo.com.cn
对于 n < 4,可以验证其分解成几个正整数的和的乘积是小于 n 的。
对于 n >= 4, 能证明其能分解成几个数的和使得乘积不小于 n。
如果分解成 1 和 n - 1,那么对乘积是没有帮助的,因此,假设 n
分解成 a 和 n - a,2 <= a <= n - 2,那么
     a * (n - a) - n
  = (a - 1) * n - a * a + a - a
  = (a - 1) * (n - a) - a
>= (a - 1) * 2 - a
  = a - 2
>= 0
如果 a, n - a 仍然 >= 4,那么继续分解,直至 a, n - a < 4。因为每次分解都能使乘积
增加,所以最优解必是最终分解结果,也即分解出的数全是 2 或 3 。
(1)
假设 n 是偶数,且分解成 a 个 2 和 b 个 3,即 n = 2 * a + 3 * b,则乘积为 2a * 3b
注意到 23 < 32 且 2 * 3 = 3 * 2 = 6,所以每 3 个 2 换成 2 个 3 会使乘积更大,因此,
最优方案是分解成 n/6*2 个 3 和 n%6/2 个 2,乘积为 3n/6*2 * 2n%6/2
(2)
假设 n 是奇数,则一定需要分出一个 3,然后 n - 3 就是偶数。因此最优方案是分解出
(n-3)/6*2+1 个 3 和 (n-3)%6/2 个 2,乘积为 3(n - 3)/6*2+1 * 2(n-3)%6/2

剩下的工作就是使用高精度乘法和反复平方法来求幂了,想偷懒的可以使用 JAVA 的 BigInteger 类。

PS:以上的运算符  “/”  表示除后取整,即 3 / 2 = 1。
       而且没能找到网上评测的题目,所以未能验证该分析是否完全正确。
原创粉丝点击