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 查看本文章