Python用贪心算法解背包问题,运算结果很奇怪

xiayanguk 2012-04-21 09:36:18
Knapsack = 20.00

items = [
(1, "1", 2.44, 3.98),
(2, "2", 3.97, 1.71),
(3, "3", 4.02, 4),
(4, "4", 1.41, 1.55),
(5, "5", 3.35, 3.65),
(6, "6", 3.46, 1.78),
(7, "7", 1.19, 2.7),
(8, "8", 4.64, 1.04),
(9, "9", 4.53, 3.11),
(10, "10", 4.17, 0.2) ]

AfterSorted = sorted(((profit/ItemWeight, ItemWeight, ItemName)
for itemno, ItemName, ItemWeight, profit in items), reverse = True)
Weight = Value = 0
Knapsacked = []
for unit_Valueue, ItemWeight, ItemName in AfterSorted:


portion = min(Knapsack - Weight, ItemWeight)
Weight += portion
addValue = portion * unit_Valueue
Value += addValue
Knapsacked += [(ItemName, portion, addValue)]

if Weight >= Knapsack:
break

print(" Item Name ItemWeight Profit")
print("\n".join("%13s %20.2f %16.2f" % item for item in Knapsacked))
print("\nItemWeight in total: %5.2f\nValueue in total: %5.2f" % (Weight, Value))

以上是我的代码,用贪心算法,取物品取到应该接近20,然后多余的背包容量不应该继续填充,结果我的程序跑出来以后,会把其中一个物品的部分容量给弄出来塞进包里,最后结果还是20KG,本来应该只有16.94KG的
不符合我的题目的要求,求指点修改,谢谢大家
...全文
821 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
angel_su 2012-04-21
  • 打赏
  • 举报
回复
用if应该就可以,代码类似:
...
items.sort(key=lambda x: -x[3]/x[2])
Weight = Value = 0
Knapsacked = []
for itemno, ItemName, ItemWeight, profit in items:
if Knapsack - Weight >= ItemWeight:
Weight += ItemWeight
Value += profit
Knapsacked.append((ItemName, ItemWeight, profit))
...
xiayanguk 2012-04-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

portion = min(Knapsack - Weight, ItemWeight)
这行的逻辑不就类似买猪肉可以叫老板切刚好,所以总共40斤不多不少...
[/Quote]

我也知道问题可能是出在这一行,不过我尝试改过,改成用portion去找列表中ItemWeight的最大值(我不知道对不对,因为这样应该就可以挖走最重的一个物品先)

但是程序提示TypeError: 'float' object is not iterable



请问应该如何解决这个问题?
angel_su 2012-04-21
  • 打赏
  • 举报
回复
portion = min(Knapsack - Weight, ItemWeight)
这行的逻辑不就类似买猪肉可以叫老板切刚好,所以总共40斤不多不少...

37,741

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧