有一个背包,背包容量是M(0<M≤200),有N(1<N≤1000)个物品,物品可以分割成任意大小。要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。
输入格式
第1行有两个数,M和N;
第2行到N+1行:第i行为第i-1个物品的价值和重量(均为小于100的正整数),中间用空格隔开。
输出格式
只有一个数,为最大总价值(保留一位小数)。
输入/输出例子1
输入:
150 7
10 35
40 30
30 60
50 50
35 40
40 10
30 25
输出:
190.6
代码:
#include<bits/stdc++.h>
using namespace std;
int n,i;
double m,ans;
struct nond//结构体
{
int val,m;
double tmp;
}e[1005];
bool cmp(nond x,nond y)
{
return x.tmp>y.tmp;
}
int main() {
scanf("%lf%d",&m,&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&e[i].val,&e[i].m);
e[i].tmp=1.0*e[i].val/e[i].m;
}
sort(e+1,e+n+1,cmp);
while(m>0)
{
if(e[i].m<m)
{
m-=e[i].m;
ans+=e[i].val;//装得下,装
}
else
{
ans+=m*e[i].tmp;
break;//装不下,退出
}
i++;
}
printf("%.1lf\n",ans);
return 0;
}