贪心-圣诞老人的礼物

题目:圣诞老人的礼物Santa Clau’s Gifts
圣诞节来临了,圣诞老人准备分发糖果,现在有多箱不同的糖果,每箱糖果
有自己的价值和重量,每箱糖果都可以拆分成任意散装组合带走。圣诞老人
的驯鹿雪橇最多只能装下重量 W 的糖果,请问圣诞老人最多能带走多大
价值的糖果。
输入:第一行由两个部分组成,分别为糖果箱数正整数n(1 <=n <= 100) 100),
驯鹿能承受的最大重量正整数 w 0 < w <10000 ),两个数用空格隔开。
其余 n 行每行对应一箱糖果,由两部分组成,分别为一箱糖果的价值正整数v和重
量正整数 w ,中间用空格隔开。
输出:输出圣诞老人能带走的糖果的最大总价值,保留1位小数。
样例输入
4 15
100 4
412 8
266 7
591 2
样例输出
1193.0

思路:因为每箱糖果都可以拆分成任意散装组合带走,因此可以利用贪心算法的思想实现。
按礼物的价值重量比从大到小依次选取礼物,对选取的礼物尽可能多地装,直到达到总重量w
价值重量比 = 价值/重量,求得1个单位重量下其价值
贪心算法:每一步行动总是按某种指标选取最优的操作来进行,该指标只看眼前,
并不考虑以后可能造成的影响。
“圣诞老人礼物”题,若糖果只能整箱拿,则贪心法错误。

python代码:
 1 def main():
 2     boxes_list = []
 3     # n-箱数,w-承受最大重量
 4     n, w = map(int, input().split())
 5     for i in range(n):
 6         temp = list(map(int, input().split()))
 7         value_rate = temp[0]/temp[1]
 8         temp.append(value_rate)
 9         boxes_list.append(temp)
10     # [[591, 2, 295.5], [412, 8, 51.5], [266, 7, 38.0], [100, 4, 25.0]]
11     boxes_list = sorted(boxes_list, key=lambda x: x[2], reverse=True)
12     # 总重量、总价值
13     totalW, totalV = 0, 0.0
14     for i in range(n):
15         if totalW + boxes_list[i][1] <= w:
16             totalW += boxes_list[i][1]
17             totalV += boxes_list[i][0]
18         else:
19             # boxes_list[i][2]i物品单个重量的价值
20             totalV += (w - totalW)*boxes_list[i][2]
21             break
22     print("圣诞老人能带走的糖果的最大总价值为:%.1f" % totalV)
23 
24 
25 if __name__ == '__main__':
26     main()
 
原文地址:https://www.cnblogs.com/an-wl/p/13401752.html