博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
将一个整数拆分使其乘积最大
阅读量:4961 次
发布时间:2019-06-12

本文共 1276 字,大约阅读时间需要 4 分钟。

class Solution {public:    int integerBreak(int n)     {        int Max,ThreeIndex,TwoIndex;        if (n < 4)        {            if (n>2)                return 2;            return n == 2 ? 1 : 0;        }        if (n % 2)        {            TwoIndex = ((n - 3) % 6) / 2 ;            ThreeIndex = (n - 3) / 6 * 2 + 1;            Max = pow(3, ThreeIndex) * pow(2,TwoIndex);        }        else        {            TwoIndex = n % 6 / 2;            ThreeIndex = n / 6 * 2;            Max = pow(3, ThreeIndex)*pow(2, TwoIndex);        }        return Max;    }};

最优化问题,尽量都分成3,不足部分就分成2。

 

对于 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。

 

 

转载于:https://www.cnblogs.com/shihaochangeworld/p/5547436.html

你可能感兴趣的文章
基于单片机定时器---年月日时分秒的算法
查看>>
linux中IDE和SATA硬盘的区别
查看>>
关于清理缓存的解决方案
查看>>
编译时获得系统的日期和时间
查看>>
Unity3D写雷电游戏(一)
查看>>
Mybatis之使用注解开发CRUD
查看>>
C语言错误:request for member ‘xxx’ in something not a structure or union
查看>>
[LintCode] Pow(x, n) 求x的n次方
查看>>
冒泡排序逐步详解相关笔记(一)
查看>>
sql server split 分割 两种方法
查看>>
spring学习之@ModelAttribute运用详解
查看>>
语义分析应用——美通社
查看>>
数据类型及操作
查看>>
提高前端开发效率的N种方法
查看>>
第一个Vus.js
查看>>
10款最好的Python IDE
查看>>
js如何获取样式?
查看>>
保护视力最佳电脑窗口颜色配置Win7、Vista和XP适用!转
查看>>
一道题的分析
查看>>
JS身份证验证
查看>>