贪心策略(未完结)

news/2025/7/9 10:30:49/文章来源:https://www.cnblogs.com/ljnljn/p/18587116

每次都试图解决问题的尽量大的一部分
如兑换硬币,先以最多数量最大面值迅速减少找零面值

  1. 首先确定基本结束条件(最直接的情况——其面值正好等于某种硬币)
  2. 减小问题的规模
    递归算法:
#!/user/bin/env python3
# -*- coding: utf-8 -*-
def recMC(coinValueList, change):minCoins = changeif change in coinValueList:return 1else:for i in [c for c in coinValueList if c <= change]:numCoins = 1 + recMC(coinValueList, change - i)if numCoins < minCoins:minCoins = numCoinsreturn minCoinsprint(recMC([1, 5, 10, 25], 63))

[c for c in coinValueList if c <= change]是一个列表推导式。
它的作用是从coinValueList中筛选出所有小于等于change的元素。
c for c in coinValueList:这部分表示从coinValueList中取出每个元素c。
if c <= change:这是一个条件判断,只有当c小于等于change时,c才会被包含在新生成的列表中。

缺点:效率低下(原因是重复计算太多)
优化的关键在于消除重复计算,如用一个表把中间结果保存下来
这个算法的中间结果就是部分找零的最优解,在递归调用过程中已经得到的最优解被记录下来在递归调用之前,先查找表中是否已有部分找零的最优解
如果有,直接返回最优解而不是递归调用
优化:

#!/user/bin/env python3
# -*- coding: utf-8 -*-
def recDC(coinValueList, change, knownResults):minCoins = changeif change in coinValueList:knownResults[change] = 1 #记录最优解return 1elif knownResults[change] > 0:return knownResults[change] #查表成功,直接用最优解else:for i in [c for c in coinValueList if c <= change]:numCoins = 1 + recDC(coinValueList, change - i, knownResults)if numCoins < minCoins:minCoins = numCoins #找到最优解,放在列表中knownResults[change] = minCoinsreturn minCoinsprint(recDC([1, 5, 10, 25], 63, [0]*64))

如果没有,才进行递归调用
√通过记忆化/函数值缓存技术提高了递归解法的性能

动态规划解法:
动态规划算法采用了一种更有条理的方式来得到问题的解
找零兑换的动态规划算法从最简单的“1分钱找零”的最优解开始,逐步递加上去,直到我们需要的找零钱数
在找零递加的过程中,设法保持每一分钱的递加都是最优解,一直加到求解找零钱数,自然得到最优解
问题的最优解包含了更小规模子问题的最优解,这是一个最优化问题能够用动态规划策略解决的必要条件
image

https://www.bilibili.com/video/BV1gy4y1E7M5?t=328.5&p=53
明天再看

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

技术框架中MyBatis参数传递的学习

MyBatis参数传递总结 MyBatis参数传递#{}方式 情况一:Mapper 映射器接口方法参数只有一个且为基本类型 接口方法: public List<UserEntity> selectUserByAge(int age);映射结果: <select id="selectUserByAge" resultMap="userResultMap">se…

电感的通低频阻高频特性的测试

用手持电桥测出电感的实际值,以保证在这个频率附近电感数值不会有太大变化 10k档     40k档   100k档 9.96mH    9.77mH   17.25mH 用示波器的信号发生器产生一个200k的信号,串接以上电感,查看输出波形当信号为200k时输出波形的峰峰值为1.55V(不接电感时为2.44…

荡秋

我怎么会写这种东西?共享单车框里载着最后一片黄黄的秋 心想要不将它保住 过减速带,咯噔 秋荡出去了 摇摇晃晃地挣扎了好一会儿 还是落了地 还好我坐稳了,手机也没掉 安全回到宿舍

参数传递进阶*args和**kwargs

函数的参数传递进阶:在python中,所有的函数,在传入参数的时候,参数都会变成*args和**kwargs两种形态1.*args表示以元组的形态*表示参数基于元组的形态进行接受和解析。根本意义上就是拆包。将元组中的元素拆包成不同的数据,转为参数传入*可以接收无限长度的参数。因为所有…

return和global关键字

return关键字:1.函数默认没有返回值2.函数执行return之后,会停止运行3.函数是否有return结果,与print无关系,能够在控制台打印,不代表就有返回值。我们只看是否有return关键字 # def demo(a): # return a+10 # # def demo_no(): # pass # # print(demo(90)) #…

whk1

选 \(B\)。

0/1地图问题

打开所有的灯 题目描述 这个灯很奇怪,点一下就会将这个灯和其周围四盏灯的开关状态全部改变。现在你的任务就是就是告诉pmshz要全部打开这些灯。 例如 0 1 1 1 0 0 1 0 1点一下最中间的灯【2,2】就变成了 0 0 1 0 1 1 1 1 1再点一下左上角的灯【1,1】就变成了 1 …

测试的基本内容

1、谈谈你对测试理解? 测试是对软件的正确性进行验证,寻找可能存在的缺陷 2、测试从哪些角度考虑? 需求测试,界面测试,功能测试,可靠性测试,可移植性测试, 兼容性测试,安全性测试,性能测试,易操作性测试 3、公司中包含哪些人员? 开发主管,测试主管,开发人员,测试…