揹包練習 FatMouse' Trade

A - FatMouse' Trade

https://vjudge.net/contest/244922#problem/A

肥鼠準備了 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

代碼:

#include <stdio.h>
#include <algorithm>
using namespace std;
struct stu
{
	double a;
	double b;
	double c;
}s[1000];
int cmp(stu x,stu y)
{
	return x.c>y.c;
}
int main()
{
	int m,n,i;
	double w,sum;
	while(~scanf("%d%d",&m,&n)&&(m+1)&&(n+1))
	{
		sum=0;
		w=0;
		for(i=0;i<n;i++)
		{
			scanf("%lf%lf",&s[i].a,&s[i].b);
			s[i].c=s[i].a/s[i].b;
		}
		sort(s,s+n,cmp);
		for(i=0;i<n;i++)
		{
			if(w+s[i].b<=m)
			{
				sum=sum+s[i].a;
				w=w+s[i].b;
			}
			else
			{
				sum=sum+(m-w)*s[i].c;
				break;
			}
		}
		printf("%.3lf\n",sum);
	}
	return 0;
} 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章