《剑指offer》14--剪绳子(整数拆分)[C++]

目录

题目描述

贪心算法

输出结果


题目描述

把一根绳子剪成多段,并且使得每段的长度乘积最大。

给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。

示例 1:

输入: 2

输出: 1

解释: 2 = 1 + 1, 1 × 1 = 1。

示例 2:

输入: 10

输出: 36

解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。

说明: 你可以假设 n 不小于 2 且不大于 58。

贪心算法

设n分成k份时乘积最大,则要令d (n/k)^k / dk等于零,或令d k*log(n/k) / dk等于零。求出来k=n/e,所以每份应尽量接近e=2.7,因此尽量凑3。

尽可能多剪长度为 3 的绳子,并且不允许有长度为 1 的绳子出现。如果出现了,就从已经切好长度为 3 的绳子中拿出一段与长度为 1 的绳子重新组合,把它们切成两段长度为 2 的绳子。

证明:当 n >= 5 时,3(n - 3) - n = 2n - 9 > 0,且 2(n - 2) - n = n - 4 > 0。因此在 n >= 5 的情况下,将绳子剪成一段为 2 或者 3,得到的乘积会更大。又因为 3(n - 3) - 2(n - 2) = n - 5 >= 0,所以剪成一段长度为 3 比长度为 2 得到的乘积更大。

cpp 复制代码
#include<iostream>
#include<vector>
using namespace std;

//计算各数位的和
class Solution {
public:
    int integerBreak(int n) {
        if (n < 2) return 0;
        if (n == 2) return 1;
        if (n == 3) return 2;
        int T3 = n / 3;
        if (n % 3 == 1) T3--;
        int T2 = (n - T3 * 3) / 2;
        return ((int)pow(3, T3)) * ((int)pow(2, T2));
    }
};


int main()
{
    Solution test;
    int result = test.integerBreak(10);
    std::cout << "mian result:" << result << std::endl;

	return 0;
}

输出结果

相关推荐
潮汐退涨月冷风霜17 分钟前
数字图像处理(1)OpenCV C++ & Opencv Python显示图像和视频
c++·python·opencv
长河1 小时前
Java开发者LLM实战——LangChain4j最新版教学知识库实战
java·开发语言
第七序章1 小时前
【C++STL】list的详细用法和底层实现
c语言·c++·自然语言处理·list
Cyan_RA91 小时前
SpringMVC @RequestMapping的使用演示和细节 详解
java·开发语言·后端·spring·mvc·ssm·springmvc
逆小舟3 小时前
【Linux】人事档案——用户及组管理
linux·c++
再见晴天*_*4 小时前
SpringBoot 中单独一个类中运行main方法报错:找不到或无法加载主类
java·开发语言·intellij idea
lqjun08276 小时前
Qt程序单独运行报错问题
开发语言·qt
hdsoft_huge8 小时前
Java & Spring Boot常见异常全解析:原因、危害、处理与防范
java·开发语言·spring boot
风中的微尘8 小时前
39.网络流入门
开发语言·网络·c++·算法
未来之窗软件服务8 小时前
幽冥大陆(二)RDIFSDK 接口文档:布草洗涤厂高效运营的技术桥梁C#—东方仙盟
开发语言·c#·rdif·仙盟创梦ide·东方仙盟