1. 程式人生 > >HDU 1009 - FatMouse' Trade (部分揹包問題)

HDU 1009 - FatMouse' Trade (部分揹包問題)

題目:
肥鼠準備了 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 豆的最大值。

示例輸入
5 3
7 2
4 3
5 2
20 3
25 18
24 15
15 10
-1 -1

示例輸出
13.333
31.500
分析:先把價效比求出來(也就是Java豆/貓糧),然後sort從大到小排序,運用貪心的思想求解。

程式碼:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring> using namespace std; struct food { int j,f; double a; }N[1010]; bool cmp(food a,food b) { return a.a>b.a; } int main() { int m,n,i; double s; while(cin>>m>>n) { s=0; if(m==-1 && n==-1) break; memset(N,0,sizeof
(N)); for(i=0;i<n;i++) { cin>>N[i].j>>N[i].f; if(N[i].f==0) N[i].a=10010;//若該房間花費的貓糧為0,保證先從該房間換Java豆。 else N[i].a=1.0*N[i].j/N[i].f; } sort(N,N+n,cmp); for(i=0;i<n;i++) { if(N[i].f<m) { s+=N[i].j; m-=N[i].f; } else { s+=m*N[i].a; break; } } printf("%.3lf\n",s); } return 0; }