圣诞老人的礼物

    xiaoxiao2023-11-20  143

    圣诞老人的礼物

    描述

    圣诞节来临了,圣诞老人准备分发糖果,现在有多箱不同的糖果,每箱糖果有自己的价值和重量,每箱糖果都可以拆分成任意散装组合带走。圣诞老人的驯鹿雪橇最多只能装下重量W的糖果,请问圣诞老人最多能带走多大价值的糖果。

    输入

    第一行由两个部分组成,分别为糖果箱数正整数n(1 <=n <= 100),驯鹿能承受的最大重量正整数w(0 < w <10000),两个数用空格隔开。其余n行每行对应一箱糖果,由两部分组成,分别为一箱糖果的价值正整数v和重量正整数w,中间用空格隔开。

    输出

    输出圣诞老人能带走的糖果的最大总价值,保留1位小数。输出为一行,以换行符结束。

    样例输入

    4 15 100 4 412 8 266 7 591 2

    样例输出

    1193.0

    分析

    用贪心算法,按礼物的价值/重量比从大到小依次选取礼物,对选 取的礼物尽可能多地装,直到达到总重量w。

    代码展示

    #include<iostream> #include<algorithm> using namespace std; const double eps = 1e-6; struct Candy { int v; int w; bool operator < (const Candy & c) const { return double(v) / w - double(c.v) / c.w > eps; } } candies[110]; int main() { int n, w; cin >> n >> w; for (int i = 0; i < n; ++i) cin >> candies[i].v >> candies[i].w; sort(candies, candies + n); int totalW = 0; double totalV = 0; for (int i = 0; i < n; ++i) { if (totalW + candies[i].w <= w) { totalW += candies[i].w; totalV += candies[i].v; } else { totalV += candies[i].v * double(w - totalW) / candies[i].w; break; } } printf("%.1f", totalV); return 0; }
    最新回复(0)