题干
AC Code
n, w = map(int, input().split()) # n种类, w核载重
a = [] # [[weight1, value1], [weight2, value2], ...]
for _ in range(n):
a.append(list(map(int, input().split())))
a.sort(key=lambda x: x[1] / x[0], reverse=True)
maxVal = 0
for i in a:
if i[0] < w: # 装得下
maxVal += i[1] # 加钱
w -= i[0] # 减负
else: # 装不下
maxVal += w * i[1] / i[0] # 能装多少装多少
break
print('%.1f' % maxVal)
一道贪心题,考察的是思路,有点像背包问题,但是要区别,因为对应的结题思路完全不同。
本题要求的是最大装载的货物价值,也就是相同装载货物数量情况下的最大价值。
对于本题,实际上属于贪心问题,对应的物体是可分的,所以采取的思路是将求单位物体对应的重量(价值),作为本题的思考角度。
而对于背包问题则不同,背包问题是对应物体不可分,他们作为一个整体,要加就只能是全加上,不存在分割成几部分,然后取其中的某一部分的情况。
a.sort(key=lambda x: x[1] / x[0], reverse=True)
上面代码表示的是按照什么规则对列表a进行排序。原来确实不会使用这种方法进行排序。通过写后面key,结合lambda函数,表示使用该list of list中的后面数值与前面数值求商,获得对应物体的单位价值,后面补充参数reverse=True,表示倒序进行排序。
背景知识参考:
可以参考下面文章,先了解一下对应背包问题有哪些,对应含义是什么?01背包问题是指的只能选择一次,而完全背包问题对应同一种物品无穷多个。此外,还有一种情况是要求在背包中存放指定物品指定次数个。
动态规划之背包问题(01背包问题、完全背包问题、多重背包问题 I、多重背包问题 II 、分组背包问题)_01背包问题时间复杂度为k-CSDN博客