HDU 1009 - FatMouse' Trade (部分揹包問題)
阿新 • • 發佈:2018-11-01
題目:
肥鼠準備了 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;
}