HDU1009 FatMouse' Trade【部分揹包】【貪心】
阿新 • • 發佈:2019-02-08
大致意思: 肥鼠準備了 M 磅的貓糧,準備和看管倉庫的貓交易,倉庫裡裝有他最喜愛的食物 Java 豆。 倉庫有 N 個房間。第 i 間房包含了 J[i] 磅的 Java 豆,需要 F[i] 磅的貓糧。肥鼠不必為了房間中的所有 Java 豆而交易,他可以支付 F[i] * a% 磅的貓糧去交換得到 J[i] * a% 磅的 Java 豆。這裡,a 表示一個實數。 現在他將這項任務分配給了你:請告訴他,能夠獲得的 Java 豆的最大值是多少。 輸入 輸入包含多組測試資料。 對於每組測試資料,以包含了兩個非負整數 M 和 N 的一行開始。接下來的 N 行,每行相應包含了兩個非負整數 J[i] 和 F[i]。 最後一組測試資料是兩個 -1。所有的整數均不超過 1000。 輸出 對於每組測試資料,在單獨的一行中列印一個實數,精確到小數點後 3 位數,表示肥鼠能夠取得的 Java 豆的最大值。 |
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int maxn = 10005; struct W { double get;//收入 double pay;//付出的貓食 double ave;//收入除以付出 } w[maxn]; bool cmp(W a, W b) { if (a.ave > b.ave) { return true; } return false; } int main() { int n; double m; while (scanf("%lf%d", &m, &n), n != -1 && m != -1) { int i; for (i = 0; i < n; ++i) { scanf("%lf %lf", &w[i].get, &w[i].pay); w[i].ave = w[i].get / w[i].pay; } sort(w, w + n, cmp);//貪心,對w按照get/pay進行降序排序 double sum = 0; for (i = 0; i <= n - 1; i++) { if (m >= w[i].pay) {//如果當前剩餘的貓食還足夠的話 sum = sum + w[i].get;//那就把那個房間的糧食全部買下 m = m - w[i].pay;//並且手上見去相應的貓食 } else {//如果現在手上的貓食已經不夠 sum = sum + w[i].ave * m;//那麼就按比例拿去一定的貓食 break; } } printf("%.3lf\n", sum); } return 0; }