サンタClauのギフト(貪欲アルゴリズム) - アルゴリズムのメモ

問題の説明

クリスマスは、お菓子の箱は、独自の価値や重みを持っているか異なるキャンディーの箱今、キャンディの各ボックスは、離れて任意のバルク組成に分割することができ、お菓子を配布するサンタクロースの準備ができて、来ています。サンタのトナカイのそりが唯一のキャンディーの重量Wの下に保持することができ、サンタクロースは、どのくらいのお菓子の値を求めるために取ることができます。

エントリー

最初の行は、2つの部分、それぞれ正の整数菓子箱N(1 <= N <= 100)で構成され(0 <10000 <W)、二つの数は、スペースで区切られたwは、トナカイは、最大の正の整数の重量に耐えることができますオープン。残りのn行キャンディのボックスに対応する空間によって分離された2つの部分、正の整数及びv wの重量正の整数キャンディボックスの値、すなわち、で構成されてい

輸出

サンタクロースは、キャンディの合計値の最大出力を取る小数を予約することができます
改行で終わる一行として出力。

サンプル入力

4 15
100 4
412 8
266 7
591 2

サンプル出力

1193.0

問題解決のためのアイデア
リバプールのに応じて价值/重量贈り物を選ぶの降順割合の合計質量ワットまで、最も費用対効果のリバプールを選択することです

#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;
}
公開された97元の記事 ウォンの賞賛208 ・は 70000 +を見て

おすすめ

転載: blog.csdn.net/weixin_45822638/article/details/105271386