python整数拆分成几个数的乘积、优先用最小数_将一个整数拆分使其乘积最大

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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值