1. 程式人生 > >C/C++ 演算法分析與設計:貪心(搬運工)

C/C++ 演算法分析與設計:貪心(搬運工)

題目描述

搬運工的工作非常辛苦,不僅是因為要費體力,而且幹活要有技巧,不能總是用蠻力。假設你是一名搬運工,給定一個最大載重量為M公斤的卡車和N種食品,有食鹽,白糖,大米等。已知第 i 種食品的擁有Wi 公斤,其商品價值為Vi元/公斤,程式設計確定一個裝貨方案,使得裝入卡車中的所有物品總價值最大。

輸入

輸入資料有多組,每組第1行有2個正整數,分別為M和N(1 <= M,N <=100),接下來有N行。這N行裡每行2個數,分別為正整數Wi和正實數Vi(1.0 <= Wi,Vi <=100.0)代表每種食品的重量和(價值/公斤)。

輸出

對於每組資料輸出卡車能裝物品的最大值(保留2位小數)。

樣例輸入

10 3
5 2
4 3
3 5

樣例輸出

33.00
#include<stdio.h>
int main()
{
	int n,m,i,j,p,s=0;
	double a[10][2],sum=0,t,t2;
	scanf("%d%d",&n,&m);
	for(i=0;i<m;i++)
	{
		scanf("%lf%lf",&a[i][0],&a[i][1]);
	}
	for(i=0;i<m;i++)
	{
		p=i;
		for(j=i+1;j<m;j++)
			if(a[j][1]>a[p][1]) p=j;
		if(p!=i){ t=a[i][0];a[i][0]=a[p][0];a[p][0]=t;
		          t2=a[i][1];a[i][1]=a[p][1];a[p][1]=t2; }
				if(s+a[i][0]>=n)
		{sum+=((n-s)*a[i][1]);printf("%.2lf\n",sum);break;}
		else
		{s+=a[i][0];sum+=a[i][0]*a[i][1];}
	}
}