3.2 最优分解问题

1.实验目的

利用贪心算法解决最优分解问题

2.实验内容

2.1 问题描述

将正整数n分成若干互不相同的自然数和,且使得自然数的乘积最大。

2.2 问题分析

小学时候学过,周长相同的正方形面积要大于长方形面积。这意味着:在总和相同的情况下,自然数间越接近,乘积越大。本道题可以用这样的思路去解。要想使自然数的乘积最大:

  • 就要使因数个数尽可能多,并且因数之间值要接近。

  • 将n分成从2开始的连续自然数和,保证因数个数尽量多。

  • 若出现余数,根据因数之间值最接近原则,让余数均匀的分摊给最前面的数,保证每个数数值尽量接近。

3.实验过程及结果

3.1 数据输入

  • 从键盘输入正整数
# todo:获取基本因数
def getindex():
    n = int(input("请输入一个正整数:"))
    a = []
    l = n
    for i in range(2,500):
        l = l-i
        a.append(i)
        if l<i:
            break
    return a,l

输入的数据是正整数,返回值a是一个列表,元素是从2开始的连续整数,l是余数,需要继续处理

3.2 实验代码

  • 解决余数
# todo:将余数分摊给前面的因数
def yushu(a,l):
    for i in range(l):
        a[i] = a[i]+1
    return a

这一步执行的是将余数分摊给前面的因数,返回值是最终的因数。

  • 因数相乘
# todo:因数相乘
def multiplication(a):
    m = 1
    for i in a:
        m = m*i
    return m

这一步的返回值是最终乘积。

3.3 实验结果

在这里插入图片描述
余数4平均分摊给前4个数,实验结果符合预期,程序正常退出。

4 实验结果

解决问题的关键在于理解贪心中贪在何处,我认为在整数分解过程中:
1.分解成尽可能多的数,
2.每个数尽量接近。
这两点体现了贪心思想。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值