王小二毕业后从事船运规划工作,吉祥号货轮的最大载重量为M吨,有10种货物可以装船。第i种货物有 w i w_i wi吨,总价值是 p i p_i pi。王小二的任务是从10种货物中挑选若干吨上船,在满足货物总重量小于等于M的前提下,运走的货物的价重比最大。
Input
输入数据的第一行有一个正整数M(0 < M < 10000),表示所有货物最大载重量。在接下来的10行中,每行有若干个数(中间用空格分开),第i行表示的是第i种货物的货物的总价值
p
i
p_i
pi,总重量
w
i
w_i
wi。(
p
i
p_i
pi是
w
i
w_i
wi的整数倍,0 <
p
i
p_i
pi ,
w
i
w_i
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
Sample Output
550
(1)题目要求运走货物的价重比达到最大,并输出船上货物的总价值。(价重比 = 价格 / 重量)
(2)使用结构体存储这10种货物各自的价值、重量以及价重比。
(3)先计算出10种货物各自的价重比,并使用sort函数将其从小到大排列,并按照这个货物顺序装船。可能这批货物正好装满船或船上有空余,这时的最大价值就是这批货的总价值;也可能装到第i(i < 10)种货物时,不能全装入,那就装入该货物的一部分,这时最大价值 = 前(i - 1)种货物的总价值 + 第 i 种货物的价重比 * 货轮剩余载重量。
- 代码实现
#include <bits/stdc++.h>
using namespace std;
struct node //结构体用于存储10种货物各自的价值、重量和价重比
{
int p; //货物价值
int w; //货物重量
int pw; //货物价重比
} a[10];
bool cmp(node a,node b) //定义比较函数cmp,作为sort函数的第三个参数,作用是将价重比从大到小排列
{
return a.pw>b.pw;
}
int main()
{
int M; //货轮的最大载重量
cin>>M;
for(int i=0;i<10;i++)
{
cin>>a[i].p>>a[i].w;
a[i].pw=a[i].p/a[i].w; //计算出每种货物的价重比
}
sort(a,a+10,cmp); //将价重比从大到小排列
int i,sum=0;
for(i=0;i<10;i++) //可以装入整个货物 i
{
if(M<a[i].w) //不能装入整个货物 i 了
break; //那就跳出循环,执行下面的语句,装入 i 的一部分
M-=a[i].w; //装上 i 后更新船的剩余载重量
sum+=a[i].p; //更新船上货物的总价值
}
if(i<10) //不能装入整个货物 i ,但船上还有空间
sum+=M*a[i].pw; //那就装入货物 i 的一部分
cout<<sum<<endl;
return 0;
}
- 运行结果