[洛谷]P2240 【深基12.例1】部分揹包問題

題目描述

阿里巴巴走進了裝滿寶藏的藏寶洞。藏寶洞裏面有 N(N \le 100)N(N≤100) 堆金幣,第 ii 堆金幣的總重量和總價值分別是 m_i,v_i(1\le m_i,v_i \le 100)mi​,vi​(1≤mi​,vi​≤100)。阿里巴巴有一個承重量爲 T(T \le 1000)T(T≤1000) 的揹包,但並沒辦法將全部的金幣都裝進去。他想裝走儘可能多價值的金幣。所有金幣都可以隨意分割,分割完的金幣重量價值比(也就是單位價格)不變。請問阿里巴巴最多可以拿走多少價值的金幣?

輸入格式

第一行兩個整數 N、T
接下來 N 行,每行兩個整數 m_i,v_imi​,vi​

輸出格式

一個整數表示答案,輸出兩位小數

輸入輸出樣例

輸入 #1複製

4 50
10 60
20 100
30 120
15 45

輸出 #1複製

240.00

【思路】

因爲金幣可以任意分割,我們不用擔心因爲揹包的體積, 放入一個揹包後, 無法放入其他揹包。

步驟如下, 我們根據每組揹包的總價值和體積,計算出每組揹包的單位價格。並按照單位價格排序。

然後優先放入單位價值高的金幣。直到揹包容量爲空爲止。(因爲揹包可以分割,所以,如果揹包剩餘空間放不下一組的話,可以把這一組的金幣分開存放。)

【代碼】

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
struct Good {
    int w, v;
    double p;
    bool operator<(const Good & a) const {
        return p > a.p;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章