#1529. 宝藏猎人的背包

宝藏猎人的背包

故事背景

在古老的金字塔中,探险家发现了许多珍贵的宝藏。每个宝藏都有不同的价值和重量,而探险家的背包容量有限。为了最大化这次探险的收益,探险家需要精心选择哪些宝藏放入背包,甚至可以选择带走部分宝藏(如果背包还有空间的话)。作为探险队的技术顾问,你需要设计一个算法来帮助探险家做出最优的选择。

题目描述

给定一组宝藏,每个宝藏有重量 wiw_i 和价值 viv_i ,以及一个容量为 C 的背包。你可以选择将宝藏的一部分放入背包(即分数背包问题),要求放入背包的总重量不超过 C ,且总价值最大。

请编写一个 C++ 程序,计算在给定条件下,背包可以容纳的最大总价值。

输入格式

第一行输入两个整数 n 和 C ( 1n1000,1C100001 \leq n \leq 1000, 1 \leq C \leq 10000 ),分别表示宝藏的数量和背包的容量。

接下来 n 行,每行输入两个整数 wiw_iviv_i1wi1000,1vi10001 \leq w_i \leq 1000, 1 \leq v_i \leq 1000 ),分别表示第 i 个宝藏的重量和价值。

输出格式

输出一个浮点数,表示背包可以容纳的最大总价值,保留两位小数。

样例输入 1

3 50
10 60
20 100
30 120

样例输出 1

240.00

样例输入 2

2 10
5 10
8 15

样例输出 2

18.75

样例输入 3

4 100
25 50
50 100
30 75
15 30

样例输出 3

205.00

提示

  • 这是一个经典的分数背包问题,贪心算法可以得到最优解
  • 考虑如何排序宝藏,使得单位重量的价值最大化
  • 注意处理背包容量不足时,可以选择部分宝藏的情况
  • 输出结果需要保留两位小数