本文实例讲述了Python基于贪心算法解决背包问题。分享给大家供大家参考,具体如下:
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
完全背包问题:给定n个物品和一个容量为C的背包,物品i的重量是Wi,其价值为Vi,背包问题是如何选择入背包的物品,使得装入背包的物品的总价值最大,与0-1背包的区别是,在完全背包问题中,可以将物品的一部分装入背包,但不能重复装入。
设计算法的思路很简单,计算物品的单位价值,然后尽可能多的将单位重量价值高的物品放入背包中。
python实现代码如下:
# coding=gbk # 完全背包问题,贪心算法 import time __author__ = 'ice' class goods: def __init__(self, goods_id, weight=0, value=0): self.id = goods_id self.weight = weight self.value = value # 不适用于0-1背包 def knapsack(capacity=0, goods_set=[]): # 按单位价值量排序 goods_set.sort(key=lambda obj: obj.value / obj.weight, reverse=True) result = [] for a_goods in goods_set: if capacity < a_goods.weight: break result.append(a_goods) capacity -= a_goods.weight if len(result) < len(goods_set) and capacity != 0: result.append(goods(a_goods.id, capacity, a_goods.value * capacity / a_goods.weight)) return result some_goods = [goods(0, 2, 4), goods(1, 8, 6), goods(2, 5, 3), goods(3, 2, 8), goods(4, 1, 2)] start_time = time.clock() res = knapsack(6, some_goods) end_time = time.clock() print('花费时间:' + str(end_time - start_time)) for obj in res: print('物品编号:' + str(obj.id) + ' ,放入重量:' + str(obj.weight) + ',放入的价值:' + str(obj.value), end=',') print('单位价值量为:' + str(obj.value / obj.weight)) # 花费时间:2.2807240614677942e-05 # 物品编号:3 ,放入重量:2,放入的价值:8,单位价值量为:4.0 # 物品编号:0 ,放入重量:2,放入的价值:4,单位价值量为:2.0 # 物品编号:4 ,放入重量:1,放入的价值:2,单位价值量为:2.0 # 物品编号:1 ,放入重量:1,放入的价值:0.75,单位价值量为:0.75
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python数据结构与算法教程》、《Python加密解密算法与技巧总结》、《Python编码操作技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。
本文向大家介绍JS基于贪心算法解决背包问题示例,包括了JS基于贪心算法解决背包问题示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JS基于贪心算法解决背包问题。分享给大家供大家参考,具体如下: 贪心算法:在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。 寻找最优解的过程,目的是得到当前最优解 部分背包问题:固定容
我试图用Python 3.x中的贪婪算法解决背包问题。下面是我的代码,以及我用来测试它的示例案例。每个示例案例的形式为行[0]=最大权重,行[1:]的形式为(权重,值。) 成功案例1: 上一次我在重写程序之前出现这样的错误,是在与int类型进行斗争。这一次似乎是在断绝关系,但我不确定如何修复它。非常感谢任何帮助。我只知道当我看到它的时候这会是一个简单的解决方案... 编辑:这必须与我的列表如何排序
我试图用Python解决背包问题,实现一个贪婪的算法。我得到的结果对我来说毫无意义。 背包: 结果:
本文向大家介绍JS使用贪心算法解决找零问题示例,包括了JS使用贪心算法解决找零问题示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JS使用贪心算法解决找零问题。分享给大家供大家参考,具体如下: 前面介绍了JS贪心算法解决背包问题,这里再来看看找零问题的解决方法。 在现实生活中,经常遇到找零问题,假设有数目不限的面值为20,10,5,1的硬币。 给出需要找零数,求出找零方案,要求:使用数
任务是典型的背包问题。求解时应采用贪婪算法。我设法创建了下面的代码,但它工作得太慢了。你能告诉我怎么加快速度吗?谢谢你。 c是背包的重量限制。n表示价格权重对的数量(这两个数字都是int类型,而不是float)。限制如下:(1)如果在相同重量的元素之间选择,价格最高的元素应该被取;(2)如果在相同价格和相同重量的元素之间选择,第一个输入的元素应该被取。
本文向大家介绍Python解决走迷宫问题算法示例,包括了Python解决走迷宫问题算法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python解决走迷宫问题算法。分享给大家供大家参考,具体如下: 问题: 输入n * m 的二维数组 表示一个迷宫 数字0表示障碍 1表示能通行 移动到相邻单元格用1步 思路: 深度优先遍历,到达每一个点,记录从起点到达每一个点的最短步数 初始化案例: