NYOJ 824 Greedy Mouse

Greedy Mouse

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 3
描述

A fat mouse prepared M pounds of cat food,ready to trade with the cats guarding the warehouse containing his

favorite food:peanut. The warehouse has N rooms.The ith room containsW[i] pounds of peanut and requires 

F[i] pounds of cat food. Fatmouse does not have to trade for all the peanut in the room,instead,he may get 

 W[i]*a% pounds of peanut if he pays F[i]*a% pounds of cat food.The mouse is a stupid mouse,so can you tell 

him the maximum amount of peanut he can obtain.

输入
The input consists of multiple test cases. Each test case begins with a line containing two non-negative integers M and N. Then N lines follow, each contains two non-negative integers W[i] and F[i] respectively. The test case is terminated by two -1. All integers are not greater than 1000.
输出
For each test case, print in a single line a real number accurate up to 3 decimal places, which is the maximum amount of penaut that FatMouse can obtain.
样例输入
5 3
7 2
4 3
5 2
20 3
25 18
24 15
15 10
-1 -1
样例输出
13.333
31.500

问题描述:这是一道基础的01背包问题,关键是注意浮点数的比较(Comp函数)以及sum求解方法。



 
#include<stdio.h>
#include<stdlib.h>
#define MAX 1001
int Comp(const void* a,const void* b);
struct Mouse{
	int w;
	int f;
	float p;
};
int main()
{
	Mouse M[MAX];
	int S,N,n,s;
	float sum;
	while(scanf("%d%d",&S,&N)!=-1)
	{
		if(S==-1&&N==-1)
			break;
        n=0,s=0,sum=0;
		while(n<N)
		{
			scanf("%d%d",&M[n].w,&M[n].f);
			M[n].p=(float)M[n].w/M[n].f;
			n++;
		}
		qsort(M,N,sizeof(M[0]),Comp); 
		s=S;
		for(n=0;n<N;n++)
		{
			if(s>=M[n].f)
			{
				sum+=M[n].w;
				s-=M[n].f;
			}
			else
			{
				sum+=M[n].p*s;
				break;
			}
		}
		printf("%.3f\n",sum);
	}
	return 0;
}
int Comp(const void* a,const void* b)
{ 
	return (*(Mouse*)b).p < (*(Mouse*)a).p ?-1:1; 
}


你可能感兴趣的:(mouse,背包问题,贪心算法,greedy,nyoj,824)