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.每个数尽量接近。
这两点体现了贪心思想。

扫描二维码关注公众号,回复: 9874416 查看本文章
发布了17 篇原创文章 · 获赞 0 · 访问量 470

猜你喜欢

转载自blog.csdn.net/yang_live/article/details/103721544
3.2
今日推荐