这是一道简单的贪心题(类似于简单的背包问题)来看看题目与思路
题目描述:
汽车核载重量为 w,可供选择的物品的数量 n。每个物品的重量为 gi, 价值为 pi。求汽车可装载的最大价值。(n<10000,w<10000,0<gi≤100,0≤pi≤100)
输出描述:
最大价值(保留一位小数)
样例输入:
5 35
99 87
68 36
79 43
75 94
7 35
样例输出:
70.1
解题思路:
一道简单的贪心题,只需要把货物的单价从大到小排列然后凑最大载重量就可以了
代码:
#include<bits/stdc++.h>
using namespace std;
struct huo
{
double g;//重量
double p;//总价
double d;//单价
}c[10002];
bool cmp(huo a,huo b)//结构体排序,对单价进行排序
{
return a.d>b.d;
}
int main()
{
int n,m;//分别为种类数和最大载重
cin>>n>>m;
for(int i=0;i<n;i++)
{
cin>>c[i].g>>c[i].p;
c[i].d=c[i].p/c[i].g;
}
sort(c,c+n,cmp);
int j=0,k=0;
double ans=0;
while(j<m)
{
if(j+c[k].g<=m)
{
ans+=c[k].p;
j+=c[k].g;
}
else//当所需装的物品总重超过最大载重的时候,剩下的载重都装载此物品
{
ans+=c[k].d*(m-j);
break;
}
k++;
}
printf("%.1lf",ans);
return 0;
}