算法学习笔记(7.3)-贪心算法(最大切分乘问题)

目录

##问题描述

 ##问题思考

##贪心策略确定

##代码实现

##时间复杂度

 ##正确性验证


##问题描述

给定一个正整数 𝑛 ,将其切分为至少两个正整数的和,求切分后所有整数的乘积最大是多少

 ##问题思考

假设我们将 𝑛 切分为 𝑚 个整数因子,其中第 𝑖 个因子记为 𝑛𝑖 ,即

本题的目标是求得所有整数因子的最大乘积,即

我们需要思考的是:切分数量 𝑚 应该多大,每个 𝑛𝑖 应该是多少?

##贪心策略确定

我们假设从n中分出一个最小的因子2,则它们的乘积为2 * (n - 2),我们将该乘积与n进行比较得到一个重要结论:

当n≥4的时候,切分出来一个2后乘积会变大,这就说明大于等于4的整数都应该被切分出来。

##贪心策略1

如果切分方案中包含≥4因子,那么它就应该被继续切分。最终的切分方案只应出现1,2,3者三种因子。

这是我们就要思考选择什么因子会使结果达到最优解,1可以直接舍弃考虑。

当n = 6时,3*3>2*2*2,说明因子3比因子2更优。

##贪心策略2

在切分方案中,最多出现两个2.因为3个2总可以替换成2个3,获得最优的更大乘积。

综上所述,可推理出以下贪心策略。

  1. 输入整数 𝑛 ,从其不断地切分出因子 3 ,直至余数为 0、1、2 。
  2. 当余数为 0 时,代表 𝑛 是 3 的倍数,因此不做任何处理。
  3. 当余数为 2 时,不继续划分,保留。
  4. 当余数为 1 时,由于 2×2>1×3 ,因此应将最后一个 3 替换为 2 。

##代码实现

#python代码示例
import math
def max_product_cutting(n) :
    if n <= 3 :
        return 1 * (n - 1) 
    a = n // 3
    b = n % 3
    if b == 1 :
        return int(math.pow(3,a-1)) * 2 * 2
    if b == 2 :
        return int(math.pow(3,a)) * 2
    return int(math.pow(3,a))
//c++代码示例
int maxProductCutting(int n)
{
	if (n <= 3)
	{
		return 1 * (n - 1) ;	
	}	
	int a = n / 3 ;
	int b = n % 3 ;
	if (b == 1)
	{
		return (int)pow(3,a-1) * 2 * 2 ;
	}
	if (b == 2)
	{
		return (int)pow(3,a) * 2 ;
	}
	return (int)pow(3,a) ;
} 

##时间复杂度

时间复杂度取决于编程语言的幂运算的实现方法。以 Python 为例,常用的幂计算函数有三种。

  • 运算符 ** 和函数 pow() 的时间复杂度均为 𝑂(log⁡⁡𝑎) 。
  • 函数 math.pow() 内部调用 C 语言库的 pow() 函数,其执行浮点取幂,时间复杂度为 𝑂(1) 。

变量 𝑎 和 𝑏 使用常数大小的额外空间,因此空间复杂度为 𝑂(1) 。

 ##正确性验证

使用反证法,只分析 𝑛≥3 的情况。

  1. 所有因子 ≤3 :假设最优切分方案中存在 ≥4 的因子 𝑥 ,那么一定可以将其继续划分为 2(𝑥−2) ,从而获得更大的乘积。这与假设矛盾。
  2. 切分方案不包含 1 :假设最优切分方案中存在一个因子 1 ,那么它一定可以合并入另外一个因子中,以获得更大的乘积。这与假设矛盾。
  3. 切分方案最多包含两个 2 :假设最优切分方案中包含三个 2 ,那么一定可以替换为两个 3 ,乘积更大。这与假设矛盾。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/663634.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Memory测试工具-stressapptest详解

✨前言&#xff1a; stressapptest 是一个用于在各种系统组件上施加压力的工具&#xff0c;特别专注于内存和CPU。通过运行各种模式的访问测试&#xff0c;stressapptest 旨在模拟高负载下的系统行为&#xff0c;并帮助发现潜在的错误&#xff0c;比如硬件故障、过热或系统组件…

第二证券股市资讯:重磅信号!五大利好来袭!

商场中&#xff0c;向好的变化正在发生。 5月29日&#xff0c;商场迎来多则重磅利好&#xff1a; 一、IMF上调本年我国经济增加预期至5%&#xff1b; 二、国务院印发《2024&#xff0d;2025年节能降碳举动计划》&#xff0c;光伏、新动力轿车等多个职业迎来方针利好&#xf…

Linux中部署MinIO

Linux中部署MinIO 下载MinIO可执行程序&#xff1a; wget https://dl.min.io/server/minio/release/linux-amd64/minio 添加执行权限&#xff1a; chmod x minio 创建存储目录&#xff0c;例如/data&#xff1a; mkdir -p /data 运行MinIO服务器&#xff0c;需要设置MIN…

Java设计模式 _行为型模式_访问者模式

一、访问者模式 1、访问者模式 访问者模式&#xff08;Visitor Pattern&#xff09;是一种行为型模式。它允许在不修改已有类结构的情况下&#xff0c;向类中添加新的操作。访问者模式通过将操作封装在一个访问者对象中&#xff0c;使得可以在不改变各个元素类的前提下&#x…

【信息学奥赛】在一个包含N个整数的数组中找到第一个质数

【信息学奥赛】在一个包含N个整数的数组中找到第一个质数 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 编写一个函数&#xff0c;用于在一个包含N个整数的数组中找到第一个质数&#xff0c;若有则返回函数的地址&#xff1b;否则返回NUL…

fps游戏如何快速定位矩阵

fps游戏如何快速定位矩阵 矩阵特点: 1、第一行第一列值的范围在**-1 ---- 1**之间&#xff0c;如果开镜之后值会变大。 2、第一行第三列的值始终为 0。 3、第一行第四列 的值比较大 &#xff0c; >300或者**<-300**。 根据这三个特点&#xff0c;定位矩阵已经足够了…

Javaweb第九次作业

采用XML映射文件的形式来映射sql语句&#xff1b;采用动态sql语句的方式&#xff0c;实现条件查询的分页。 controller Slf4j RestController RequestMapping("supermarket111") public class SupermarketFenyeController {AutowiredSupermarketFenyeService super…

flutter开发实战-下拉刷新继续下拉路由进入活动页面实现

flutter开发实战-下拉刷新继续下拉路由进入活动页面实现 很多应用都有首页通过下拉刷新&#xff0c;继续下拉进入新的活动会场进入方式。在Flutter中&#xff0c;也可以通过pull_to_refresh来实现控制刷新页&#xff0c;继续下拉进入新的活动会场页面 一、引入pull_to_refres…

svg实现一个圆形以及方形的环形进度条

1. svg实现圆形进度条 效果图&#xff1a; 1. 写个假接口&#xff1a; let res {curLegendList: [{ progress: "87", name: "进度1",color:"#00fe41" },{ progress: "66", name: "进度2" ,color:"orange"},{ p…

HarmonyOS鸿蒙学习笔记(25)相对布局 RelativeContainer详细说明

RelativeContainer 简介 前言核心概念官方实例官方实例改造蓝色方块改造center 属性说明参考资料 前言 RelativeContainer是鸿蒙的相对布局组件&#xff0c;它的布局很灵活&#xff0c;可以很方便的控制各个子UI 组件的相对位置&#xff0c;其布局理念有点类似于android的约束…

OpenPCDet

一.简介 源码链接&#xff1a; https://github.com/open-mmlab/OpenPCDethttps://github.com/open-mmlab/OpenPCDet OpenPCDet 是一套基于PyTorch实现的点云3D目标检测代码库。&#xff08;也是个框架&#xff09; 设计思想&#xff1a;点云数据集&#xff08;KITTI、NuSce…

pytorch学习笔记2

首先如果遇到conda找不到包&#xff0c;pip老是超时的情况建议添加一下镜像源 conda的 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ cond…

【C++ | 类】类和对象

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a; 本文未经允许…

收银系统源码-千呼新零售2.0【智慧供应链】

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货等连锁店使用。 详细介绍请查看下…

为什么String要被设置为不可变的

为什么设置为不可变的 Java 中将 String 设计为不可变的原因有多个&#xff0c;主要涉及到安全、效率、同步和设计哲学 缓存 在我们的JVM中&#xff0c;单独开辟了一个空间来存储Java字符串&#xff0c;就是字符串池 String s1"1234"; String s2"766"; …

iPhone快捷指令之九宫格照片(三)

说明&#xff1a;这个是经过前两章的摸索&#xff0c;在我搞明白怎么接共享表单里的数据和会使用变量后&#xff0c;制作出来的终极九宫格照片指令&#xff0c;同一个指令在主屏幕里点击可以选择图片做九宫格图片&#xff1b;在相册里选择图片&#xff0c;点击分享按钮&#xf…

Kotlin 2.0 重磅发布! 性能提升!新功能上线!开发者必看!

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

C++ 关系运算

一 关系运算 二 关系运算符 三 关系表达式 四 关系表达式的值-------逻辑值 五 运算的优先级 六 注意事项 七 总结

【ai】pycharm安装github copilot解决chat一直无法初始化loading的问题

github copilot github-copilot 插件安装后:在工具里找到它 底部也有它 侧边可以chat 更新到2014.1.2copilot 也是最新但是chat 就是一直无法loading成功显示一直在初始化copilot中fix :

Python | Leetcode Python题解之第119题杨辉三角II

题目&#xff1a; 题解&#xff1a; class Solution:def getRow(self, rowIndex: int) -> List[int]:row [1, 1]if rowIndex < 1:return row[:rowIndex 1]elif rowIndex > 2:for i in range(rowIndex - 1):row [row[j] row[j 1] for j in range(i 1)]row.inser…