Description
王小二毕业后从事船运规划工作,吉祥号货轮的最大载重量为M吨,有10种货物可以装船。第i种货物有wi吨,总价值是pi。王小二的任务是从10种货物中挑选若干吨上船,在满足货物总重量小于等于M的前提下,运走的货物的价重比最大。
Input
输入数据的第一行有一个正整数M(0 < M < 10000),表示所有货物最大载重量。在接下来的10行中,每行有若干个数(中间用空格分开),第i行表示的是第i种货物的货物的总价值pi ,总重量wi。(pi是wi的整数倍,0 < pi , wi < 1000)
Output
输出一个整数,表示可以得到的最大价值。
Sample
Input
100
10 10
20 10
30 10
40 10
50 10
60 10
70 10
80 10
90 10
100 10
Output
550
题解:
经典贪心问题,货物可以拆,计算货物的价值与重量的比值,选取比值高(价值高)的装船,货物价值与重量是倍数关系,所以用INT即可。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
/**
*使用结构体来存储货物信息。
*w货物的重量
*p货物的价值
*ave货物的价值与重量之比。
*/
struct goods{
int w,p,ave;
}good[15],t;
/**
*冒泡排序,按货物的ave进行降序排序。
*/
void f(){
int i,j;
for(i=0;i<9;i++)
{
for(j=0;j<9-i;j++){
if(good[j].ave<good[j+1].ave)
{
t = good[j];
good[j] = good[j+1];
good[j+1] = t;
}
}
}
}
int main()
{
/**
*m船可承载的最大重量。
*sum船最大可以装的货物价值。
*/
int m;
int i, sum = 0;
scanf("%d",&m);
//一共10件货物,输入货物的重量价值,并且计算ave。
for(i=0; i<10; i++){
scanf("%d%d", &good[i].p, &good[i].w);
good[i].ave = good[i].p / good[i].w;
}
f();
for(i=0; i<10 && m!=0; i++){
if(m>=good[i].w){
sum += good[i].p;
m -= good[i].w;
}
else{
sum += m * good[i].ave;
m = 0;
}
}
printf("%d
",sum);
return 0;
}