題目描述
阿里巴巴走進了裝滿寶藏的藏寶洞。藏寶洞裏面有 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;
}
};