题目:圣诞老人的礼物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()